home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 135 < prev    next >
Text File  |  1996-02-09  |  144KB  |  3,799 lines

  1. C.S.M.P. Digest             Thu, 08 Feb 96       Volume 3 : Issue 135
  2.  
  3. Today's Topics:
  4.  
  5.         Command-Shift-Keys
  6.         CustomPutFile Puzzle?
  7.         Detecting QuickTime PowerPlug
  8.         How can you use 68K MPW .o file in PPC apps?
  9.         How do I create many menus from one MENU resource?
  10.         MacApp newbie questions
  11.         Matching struct definitions to TMPL resources
  12.         Menu Manager limitations?
  13.         Programming a PinnBall
  14.         Q: When to call ReleaseResource?
  15.         Quickdraw 3D intro??
  16.         Starting MacTCP on startup
  17.         VBL Afterlife
  18.         Why would dragging in a thumb crash?
  19.         [ANNOUNCE] BSP Tree Demo Application v1.3
  20.         [Q] PowerPC VBLs?
  21.         _Jackson Trap
  22.         detecting CD-ROM
  23.  
  24.  
  25.  
  26. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  27. (pottier@clipper.ens.fr).
  28.  
  29. The digest is a collection of article threads from the internet
  30. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  31. csmp.games. It is designed for people who read news semi-regularly and
  32. want an archive of the discussions.  If you don't know what a
  33. newsgroup is, you probably don't have access to it. Ask your systems
  34. administrator(s) for details. If you don't have access to news, you
  35. may still be able to post messages to the group by using a mail server
  36. like anon.penet.fi (mail help@anon.penet.fi for more information).
  37.  
  38. Each issue of the digest contains one or more sets of articles (called
  39. threads), with each set corresponding to a 'discussion' of a particular
  40. subject.  The articles are not edited; all articles included in this digest
  41. are in their original posted form (as received by our news server at
  42. nef.ens.fr).  Article threads are not added to the digest until the last
  43. article added to the thread is at least two weeks old (this is to ensure that
  44. the thread is dead before adding it to the digest).  Article threads that
  45. consist of only one message are generally not included in the digest.
  46.  
  47. The digest is officially distributed by two means, by email and ftp.
  48.  
  49. If you want to receive the digest by mail, send email to listserv@ens.fr
  50. with no subject and one of the following commands as body:
  51.     help                                Sends you a summary of commands
  52.     subscribe csmp-digest Your Name     Adds you to the mailing list
  53.     signoff csmp-digest                 Removes you from the list
  54. Once you have subscribed, you will automatically receive each new
  55. issue as it is created.
  56.  
  57. The official ftp info is ftp://ftp.dartmouth.edu/pub/csmp-digest.
  58. Questions related to the ftp site should be directed to
  59. scott.silver@dartmouth.edu.
  60.  
  61. -------------------------------------------------------
  62.  
  63. >From timmyd@netcom.com (Tim DeBenedictis)
  64. Subject: Command-Shift-Keys
  65. Date: Sat, 13 Jan 1996 21:24:27 GMT
  66. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  67.  
  68. This is actually in response to me earlier "Why won't my command-keys 
  69. work?" question; many thanks to all of you who answered.  I now 
  70. understand the problem, and I have an idea for a solution.  Essentially, 
  71. here's the idea:
  72.  
  73. 1) When the "command" key is down, and I get a key-down event, I can 
  74. manually check to see if the shift key is down by using GetKeys.
  75.  
  76. 2) If the shift key is not down, I just pass the character code from the 
  77. KeyDown event to MenuKey, and everything works the way it does currently, 
  78. no problem.
  79.  
  80. 3) If the shift key -is- down, I need to convert the key code ffrom the 
  81. KeyDown event to a character code, given that the shift key is now also 
  82. down.  The only missing piece is that I need to know how to do this.  I 
  83. am assuming that there's some built-in toolbox trap which does this, or 
  84. some other relaible method.
  85.  
  86. Any ideas?
  87.  
  88. Thanks again,
  89.  
  90. -Tim DeBenedictis
  91.  
  92.  
  93. +++++++++++++++++++++++++++
  94.  
  95. >From dnebing@epix.net (Dave Nebinger)
  96. Date: Mon, 15 Jan 1996 14:49:28 -0500
  97. Organization: KHP Services, Inc
  98.  
  99. In article <timmydDL524r.5p2@netcom.com>, timmyd@netcom.com (Tim
  100. DeBenedictis) wrote:
  101.  
  102. > This is actually in response to me earlier "Why won't my command-keys 
  103. > work?" question; many thanks to all of you who answered.  I now 
  104. > understand the problem, and I have an idea for a solution.  Essentially, 
  105. > here's the idea:
  106. > 1) When the "command" key is down, and I get a key-down event, I can 
  107. > manually check to see if the shift key is down by using GetKeys.
  108.  
  109. And would this really work?  If the delay is too long from the point when
  110. the key command is issued and when it is received, the shift key may not
  111. be down.
  112.  
  113. Start a processor intensive task in the background and initiate an event
  114. in the foreground.  By the time the app gets the event you could be off filling
  115. your coffee cup.
  116.  
  117. Simply put, when your app receives and processes the event is completely
  118. independent from the state of the keyboard.  That's the nature of event
  119. processing and the multiprocessing system.
  120.  
  121. Dave.
  122.  
  123. ==========================================================
  124. Dave Nebinger                             dnebing@epix.net
  125.              The Alt.Sources.Mac Archivist
  126.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  127.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  128.  
  129. +++++++++++++++++++++++++++
  130.  
  131. >From pcastine@prz.tu-berlin.de (Peter Castine)
  132. Date: Tue, 16 Jan 1996 14:07:55 +0100
  133. Organization: Process Control Center, TU Berlin
  134.  
  135. In article <timmydDL524r.5p2@netcom.com>, timmyd@netcom.com (Tim
  136. DeBenedictis) wrote:
  137.  
  138. > This is actually in response to me earlier "Why won't my command-keys 
  139. > work?" question; many thanks to all of you who answered.  I now 
  140. > understand the problem, and I have an idea for a solution.  Essentially, 
  141. > here's the idea:
  142. > 1) When the "command" key is down, and I get a key-down event, I can 
  143. > manually check to see if the shift key is down by using GetKeys.
  144.  
  145. A better bet is to take a look at the modifiers flags in the Event Record.
  146. A finite amount of time has passed between when the Command-Key event was
  147. posted and when you call _GetKeys; things may have changed in that time.
  148.  
  149. I may have misdirected Tim in a former post I sent. The actual culprit in
  150. the Command-Shift business is the _KeyTrans trap, which translates virtual
  151. key codes into ASCII and ignores the Shift flag when the Command flag is
  152. set. The modifier flags in the Event Record ought to correctly represent
  153. what the user pressed.
  154.  
  155. > 3) If the shift key -is- down, I need to convert the key code ffrom the 
  156. > KeyDown event to a character code, given that the shift key is now also 
  157. > down.  The only missing piece is that I need to know how to do this.  
  158.  
  159. _KeyTrans is the trap to use.
  160.  
  161. This was nicely documented in the old TechNote ``International
  162. Cancelling,'' including more than sufficient source code. The information
  163. has been folded into the new _Inside Macintosh: Text_, Appendix C (pp.
  164. C-23 ff.).
  165.  
  166. Hope this helps,
  167.  
  168. Peter
  169.  
  170. - -------------- http://www.prz.tu-berlin.de/~pcastine/Music --------------
  171. Dr. Peter Castine           | Grosze Potentaten und Regenten haben die
  172. pcastine@prz.tu-berlin.de   | Pflicht, sich um die freien Kuenste zu
  173. Process Control Center      | kuemmern. Zwar haben Privatleute Lust an der 
  174. Technical University Berlin | Musik und lieben sie, aber koennen sie nicht
  175.                             | finanzieren.                -- Martin Luther
  176.  
  177. +++++++++++++++++++++++++++
  178.  
  179. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  180. Date: 18 Jan 1996 02:35:31 GMT
  181. Organization: Royal Institute of Technology, Stockholm, Sweden
  182.  
  183. In article <pcastine-1601961407550001@maggie.prz.tu-berlin.de> pcastine@prz.tu-berlin.de (Peter Castine) writes:
  184. ) I may have misdirected Tim in a former post I sent. The actual culprit in
  185. ) the Command-Shift business is the _KeyTrans trap, which translates virtual
  186. ) key codes into ASCII and ignores the Shift flag when the Command flag is
  187. ) set.
  188.  
  189. You're still wrong; KeyTranslate only follows orders.  The actual culprit
  190. is the KCHR resource.
  191.  
  192.  
  193. /Bo Lindbergh
  194.  
  195. +++++++++++++++++++++++++++
  196.  
  197. >From Brown Edward W -BSc Mod Comp <cme92024>
  198. Date: 16 Jan 96 14:58:21 GMT
  199. Organization: (none)
  200.  
  201. You can tell if the shift key is pressed from the modifiers field of the event
  202. record. I believe you have to decode the key into a menu option yourself.
  203.  
  204. Ed.
  205.  
  206.  
  207. +++++++++++++++++++++++++++
  208.  
  209. >From CatGuy@lamg.com (Milo Shiff)
  210. Date: 20 Jan 1996 04:25:29 GMT
  211. Organization: Los Angeles Macintosh Group BBS
  212.  
  213. In article <timmydDL524r.5p2@netcom.com>, timmyd@netcom.com (Tim
  214. DeBenedictis) wrote:
  215.  
  216. > This is actually in response to me earlier "Why won't my command-keys 
  217. > work?" question; many thanks to all of you who answered.  I now 
  218. > understand the problem, and I have an idea for a solution.  Essentially, 
  219. > here's the idea:
  220. > 1) When the "command" key is down, and I get a key-down event, I can 
  221. > manually check to see if the shift key is down by using GetKeys.
  222.  
  223.    I use shift and option keys for special modifiers to the command key
  224. combinations in several of my programs.
  225.  
  226.    At offset $E (decimal 18) of the event record you will find the modifier
  227. flags. Bit 11 is the option key, bit 9 is the shift key, and bit 8 is the
  228. command key.
  229.  
  230.    Simply run a test on what combinations of modifier keys are being held
  231. down and then dispatch accordingly.
  232.  
  233.    By the way, I do NOT recommend using _MenuKey to evaluate command keys.
  234. You gain a lot of flexibility by keeping your own table. In addition to being
  235. able to maintain command key combinations that don't appear in your menus,
  236. you can more easily implement a user defined mapping of command key
  237. functions.
  238.  
  239. - via BulkRate 2.1
  240.  
  241. ---------------------------
  242.  
  243. >From Roger.W.Brown@hanover.valley.net (Roger Brown)
  244. Subject: CustomPutFile Puzzle?
  245. Date: 20 Jan 1996 16:30:25 GMT
  246. Organization: Moonlight Software
  247.  
  248. I want to make what appeared to be a simple extension to CustomPutFile
  249. but I can't figure out how to do it. When the user clicks the "Save"
  250. button and the file name matches an existing file, I want to add an
  251. "Append" option to the "Cancel" and "Replace" buttons that appear in
  252. the standard "Replace" dialog.
  253.  
  254. Here are two things that I tried and the problems that resulted:
  255.  
  256. 1. I tried a custom dialog hook and a custom dialog to use instead of
  257. the "Replace" dialog. This worked fine by adding a different "Replace"
  258. dialog with the same id as the System one in my program. My version has
  259. an Append button and the dialog hook proc detects hits in that button.
  260.  
  261. The problem is that all other uses of SFPutFile variants in the program
  262. use the "append-capable" replace dialog in my program when appending
  263. makes no sense in their contexts. Is there a clean way to tell or trick
  264. CustomPutFile to use my replace dialog only in one case? I don't want
  265. to have to rewrite the resource map to fiddle with resource ID's every
  266. time this procedure is accessed.
  267.  
  268. 2. A much more involved approach is to use a Modal Dialog filter that
  269. detects clicks on the Open/Save button and then does all the business
  270. of seeing if the file name is already used. I think I can get the
  271. information I want from the sfReply record if I access it through the
  272. myDataPtr parameter. The problem here is that, contrary to what Inside
  273. Mac says, the modal dialog filter gets events AFTER they are already
  274. processed and does not get notification of the Open/Save button being
  275. pushed at all! 
  276.  
  277. Does anyone have any better ideas? Or tell me what I am missing here?
  278.  
  279. Thanks
  280.  
  281. - ------------------------------------------------------------------
  282. Roger Brown                                roger.brown@valley.net
  283. Moonlight Software
  284. West Lebanon, NH, USA
  285.  
  286. +++++++++++++++++++++++++++
  287.  
  288. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  289. Date: Sat, 20 Jan 1996 14:02:41 -0500
  290. Organization: Carnegie Mellon, Pittsburgh, PA
  291.  
  292. Roger.W.Brown@hanover.valley.net (Roger Brown) writes:
  293. > I want to make what appeared to be a simple extension to CustomPutFile
  294. > but I can't figure out how to do it. When the user clicks the "Save"
  295. > button and the file name matches an existing file, I want to add an
  296. > "Append" option to the "Cancel" and "Replace" buttons that appear in
  297. > the standard "Replace" dialog.
  298. > Here are two things that I tried and the problems that resulted:
  299. > 1. I tried a custom dialog hook and a custom dialog to use instead of
  300. > the "Replace" dialog. This worked fine by adding a different "Replace"
  301. > dialog with the same id as the System one in my program. My version has
  302. > an Append button and the dialog hook proc detects hits in that button.
  303. > The problem is that all other uses of SFPutFile variants in the program
  304. > use the "append-capable" replace dialog in my program when appending
  305. > makes no sense in their contexts. Is there a clean way to tell or trick
  306. > CustomPutFile to use my replace dialog only in one case? I don't want
  307. > to have to rewrite the resource map to fiddle with resource ID's every
  308. > time this procedure is accessed.
  309.  
  310. Rewrite the resource map? Not sure what you mean. 
  311.  
  312. CustomPutFile has a dialogid argument. That's what you use to specify
  313. a dialog resource. If you put your dialog resource (with the Append
  314. button) in as resource 2000, and a normal dialog in as 2001, you can
  315. switch back and forth just by supplying 2000 or 2001 in the dialogid
  316. argument.
  317.  
  318. Is that what you meant?
  319.  
  320. --Z
  321.  
  322. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  323.  
  324. +++++++++++++++++++++++++++
  325.  
  326. >From stk@berlin.snafu.de (Stefan Kurth)
  327. Date: Sun, 21 Jan 1996 00:34:14 +0100
  328. Organization: none
  329.  
  330. Roger Brown <Roger.W.Brown@hanover.valley.net> wrote:
  331.  
  332. > I want to make what appeared to be a simple extension to CustomPutFile
  333. > but I can't figure out how to do it. When the user clicks the "Save"
  334. > button and the file name matches an existing file, I want to add an
  335. > "Append" option to the "Cancel" and "Replace" buttons that appear in
  336. > the standard "Replace" dialog.
  337.  
  338. Write a dialogHook function.  Upon receiving sfItemOpenButton, check if
  339. the file already exists.  If it does, put up your custom
  340. Replace/Append/Cancel dialog.  If the user clicks Cancel, return
  341. sfHookNullEvent from the dialogHook.  If the user clicks Replace or
  342. Append, note this in a global variable, and return sfHookCancelButton.
  343. This is important, because otherwise the system would put up its own
  344. Replace dialog after yours.  So you'll need a global variable to
  345. distinguish whether the user clicked cancel in the main dialog, or
  346. Replace or Append in your custom dialog.
  347.  
  348.  
  349. -- 
  350. Stefan Kurth
  351. Berlin, Germany
  352.  
  353. ---------------------------
  354.  
  355. >From mlh@piglet.amscons.com (Mark L. Hessenflow)
  356. Subject: Detecting QuickTime PowerPlug
  357. Date: 24 Jan 1996 12:08:36 -0800
  358. Organization: Amstadt Consulting Group, San Jose, CA
  359.  
  360.  
  361. I have some code which creates a preview picture for a file using the
  362. QuickTime routines MakePreviewPicture() and AddFilePreview(). I check
  363. with gestalt to see if both QuickTime and the image compression tools
  364. are available before making the calls.
  365.  
  366. When running on the PowerPC, if QuickTime is installed but 'QuickTime
  367. PowerPlug' is not, then the call to AddFilePreview() crashes. 
  368.  
  369. In any other case, the code produces the preview if QuickTime is
  370. installed, or doesn't if QuickTime is not installed.
  371.  
  372. Here is the code I use:
  373.  
  374. err = Gestalt( gestaltQuickTime, &attributes );
  375. if( err == noErr ) {
  376.         err = Gestalt( gestaltCompressionMgr, &attributes );
  377.         if( err == noErr ) {
  378.                 picHandle = MakePreviewPicture( iconOffscreen );
  379.                 if( picHandle ) {
  380.                         (void) AddFilePreview( resFile, 'PICT', picHandle );
  381.                         }
  382.                 }
  383.         }
  384.  
  385. So is there any way to detect 'QuickTime PowerPlug'?  Should I be doing
  386. anything to make sure the shared library is loaded into memory?
  387.  
  388. -Mark
  389.  
  390. --
  391. Mark L. Hessenflow
  392. mlh@kerygma.com
  393.  
  394.  
  395. +++++++++++++++++++++++++++
  396.  
  397. >From sanford@CS.Arizona.EDU (Sanford H. Selznick)
  398. Date: 24 Jan 1996 22:45:31 -0700
  399. Organization: University of Arizona CS Department, Tucson AZ
  400.  
  401. Oh... this one...
  402.  
  403. bool QuickTimeIsInstalled(void) 
  404. {
  405.   long            qtVersion;
  406.   OSErr           anErr;
  407. #ifdef powerc
  408.   long            qtFeatures; 
  409. #endif
  410.  
  411.   anErr = Gestalt(gestaltQuickTime, &qtVersion);
  412.   if (anErr != noErr)
  413.     return FALSE;           // no QT present
  414.  
  415. #ifdef powerc 
  416.   // Test if the library is registered.
  417.   anErr = Gestalt(gestaltQuickTimeFeatures, &qtFeatures);
  418.   if ( !( (anErr == noErr)  &&  
  419.           (qtFeatures & (1 << gestaltPPCQuickTimeLibPresent))    
  420.         ) )  // not TRUE
  421.     return FALSE;
  422. #endif 
  423.  
  424.   return TRUE;
  425. }
  426.  
  427. I think I got this (or something similar) off a QuickTime Web page
  428. over at Apple somewhere.
  429.  
  430. Hope this helps,
  431.   Sanford
  432.  
  433. +++++++++++++++++++++++++++
  434.  
  435. >From isis@isis-intl.com (Mike Cohen)
  436. Date: Thu, 25 Jan 1996 12:10:11 -0600
  437. Organization: ISIS International
  438.  
  439. In article <4e63k4$s7s@piglet.amscons.com>,
  440. mlh@piglet.amscons.com (Mark L. Hessenflow) wrote:
  441.  
  442. >When running on the PowerPC, if QuickTime is installed but 'QuickTime
  443. >PowerPlug' is not, then the call to AddFilePreview() crashes. 
  444.  
  445. I assume you have QuickTimeLib weak linked. If so, check the address of any
  446. functions in it before you call them. You should do something like:
  447.  
  448.         if (AddFilePreview != NULL)
  449.                 AddFilePreview(...);
  450.         else
  451.                 error("QuickTime PowerPlug isn't installed");
  452.  
  453. If you don't use weak link, your application will refuse to launch
  454. completely if it isn't installed.
  455.  
  456.  
  457. --
  458. Mike Cohen - isis@isis-intl.com
  459. Home Page: http://www.isis-intl.com/
  460. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  461. *** Save Mystery Science Theater 3000! Comedy Central has decided to
  462. *** cancel it. Call them at (212) 767-8600 and tell them what you think.
  463. *** Full details at http://fermi.clas.virginia.edu/~jcp9j/canceled.html
  464.  
  465. ---------------------------
  466.  
  467. >From msmail.hewittj@tsod.lmig.com (Jon Hewitt)
  468. Subject: How can you use 68K MPW .o file in PPC apps?
  469. Date: Thu, 18 Jan 1996 09:53:19 -0500
  470. Organization: Liberty Mutual Group
  471.  
  472. Hi,
  473.  
  474. I have an API that requires a 68K MPW .o file which has no PPC library
  475. counterpart. : * (
  476.  
  477. I assume that in order to be able to built a PPC app I will have to use
  478. the Mixed Mode Manager.  But other than that, I'm not sure how to start. 
  479. Principally my problem is this:
  480.  
  481. How do you include the .o file in the application?  It doesn't seem like
  482. either Metrowerks or Symantec (I would like to use both) allow you to
  483. include .o files in PPC projects.  Do I need to build a code resource?  If
  484. so, how do I call the functions in the API?
  485.  
  486. Does anyone know of sample code I could look at?
  487.  
  488.  
  489. Thanks for any help you can offer,
  490.  
  491. Jon Hewitt
  492.  
  493. -- 
  494. msmail.hewittj@tsod.lmig.com
  495. My opinions are not necessarily those of my employer.
  496.  
  497. +++++++++++++++++++++++++++
  498.  
  499. >From Etay_Bogner@mail.stil.scitex.com (Etay Bogner)
  500. Date: Sun, 21 Jan 1996 10:24:52 +0200
  501. Organization: Scitex Corp.
  502.  
  503. In article <msmail.hewittj-1801960953190001@hewitt.lmig.com>,
  504. msmail.hewittj@tsod.lmig.com (Jon Hewitt) wrote:
  505.  
  506. >> Hi,
  507. >> 
  508. >> I have an API that requires a 68K MPW .o file which has no PPC library
  509. >> counterpart. : * (
  510. >> 
  511.  
  512. It somewhat depends on how the functions in the .o are compiled and how
  513. many of them do you have, but basically build a code resource.
  514.  
  515. You have several options on how to get to the functions inside the .o :
  516.  
  517. 1) build a mixed mode entry per function and return their addresses via a
  518. pointer to array of pointers to functions returned from the main of the
  519. CR.
  520. The client can define it's own functions that will jump to those pointers
  521. or do a PPC asm hack where you install those pointers in the RTOC ( my
  522. prefered way :-), but a more complex one. you'll have to create a shared
  523. library that will contain entries for those functions, and than replace in
  524. the TOC those fake entries with those is the 68K CR. This ensures that no
  525. code change is required, and one can easily switch to a native version of
  526. this library when it becomes available without changing the client, just
  527. replacing the shared library )
  528.  
  529. 2) build one mixed mode entry for the CR's main, and dispatch yourself.
  530. This will work for register dispatched code.
  531.  
  532. Take a look at one of MPW's examples :
  533.  
  534. ...:MPW:Examples:PPCExamples:CExamples:PPC-68K:
  535.  
  536. -- 
  537. -- Etay Bogner,
  538. -- Etay_Bogner@mail.stil.scitex.com,
  539. -- Scitex Corp.
  540. -- Israel.
  541.  
  542. ---------------------------
  543.  
  544. >From davef@mbl.edu (Dave Fernandes)
  545. Subject: How do I create many menus from one MENU resource?
  546. Date: Fri, 19 Jan 1996 16:35:25 -0500
  547. Organization: Marine Biological Laboratory
  548.  
  549. My problem is that I have a document window with a popup menu that is
  550. filled in dynamically depending on the contents of the document.  If I
  551. want to open more than one document, the popup menus in different document
  552. windows might have different contents.  Do I need to have a seperate MENU
  553. resource for each document I want to open?  Or is there a way to create
  554. independent menus from one resource?
  555.  
  556. I'm doing this within PowerPlant, though I don't think that matters.
  557.  
  558. -- 
  559. Dave Fernandes
  560. Postdoctoral Research Associate
  561. The Ecosystems Center
  562. Marine Biological Laboratory
  563.  
  564. +++++++++++++++++++++++++++
  565.  
  566. >From cpopetz@metrowerks.com (Clinton Popetz)
  567. Date: 20 Jan 1996 00:51:11 GMT
  568. Organization: Metrowerks Inc.
  569.  
  570. In article <davef-1901961635250001@128.128.173.90>, davef@mbl.edu (Dave
  571. Fernandes) wrote:
  572.  
  573. >My problem is that I have a document window with a popup menu that is
  574. >filled in dynamically depending on the contents of the document.  If I
  575. >want to open more than one document, the popup menus in different document
  576. >windows might have different contents.  Do I need to have a seperate MENU
  577. >resource for each document I want to open?  Or is there a way to create
  578. >independent menus from one resource?
  579. >
  580. >I'm doing this within PowerPlant, though I don't think that matters.
  581.  
  582. This is the bane of popup menus.  The problem is that LStdPopupMenu (and
  583. in fact most popup menu implementations since System 7) use the CDEF which
  584. the system provides for Popups.  It keeps you from having to do things
  585. like dynamically resize the frame, draw the drop shadow, etc. by hand.
  586.  
  587. The problem is that it expects a MENU resource number in the NewControl
  588. call.  And if you have two popups loaded from the same resource, they will
  589. effect each other when items are added/removed.  
  590.  
  591. There are two ways people attempt to solve this.  Many programs just keep
  592. a ton of empty MENU resources around, and hope they don't run out.  This
  593. only delays problems in most cases.  (NCSA Mosaic kept 50 popups around. 
  594. But one day, someone hit a page where there were 51 forms, and WHAMMO)
  595.  
  596. There is another possibility that works for me, although no one has
  597. verified that it is OK by the System.
  598.  
  599. I subclass LStdPopupMenu to make a CPopupWithDummy.   And I override
  600. FinishCreateSelf in the following way:
  601.  
  602. void
  603. CPopupWithDummy::FinishCreateSelf()
  604. {
  605.    //here be dragons
  606.    
  607.    MenuHandle newHandle = ::NewMenu(sMenuID++,"\p");
  608.    ::InsertMenu(newHandle,-1);
  609.    
  610.    PopupPrivateDataHandle  dataH =
  611.       (PopupPrivateDataHandle) (**GetMacControl()).contrlData;
  612.    (*dataH)->mHandle = newHandle;
  613.    (*dataH)->mID = mMenuID;   
  614. }
  615.  
  616. So I fool the CDEF into using a new MenuHandle.
  617.  
  618. sMenuID is a static that counts up, so that I don't use the same ID
  619. twice.  Eventually this will turn over, and things will be bad.  
  620.  
  621. But this WORKS, and I haven't gotten it to crash.  When the control is
  622. destroyed, the MacOS CDEF will not call ReleaseResource on the Menu,
  623. because it doesn't know how many times you are using it.  
  624.  
  625. The other alternative is to do it the old System 6 way, where you use your
  626. own CDEF and take care of everything by hand.  This is not fun...
  627.  
  628.                                        -Clint
  629.  
  630. -- 
  631. /** 
  632.  * Clinton Popetz
  633.  * cpopetz@metrowerks.com 
  634.  * Arnold's Coffee Boy
  635.  */
  636.  
  637. +++++++++++++++++++++++++++
  638.  
  639. >From jbruyndonckx@waveresearch.com (Jan Bruyndonckx)
  640. Date: Mon, 22 Jan 1996 09:27:15 +0100
  641. Organization: Cratylus Corp
  642.  
  643. In article <davef-1901961635250001@128.128.173.90>, davef@mbl.edu (Dave
  644. Fernandes) wrote:
  645.  
  646. > My problem is that I have a document window with a popup menu that is
  647. > filled in dynamically depending on the contents of the document.  If I
  648. > want to open more than one document, the popup menus in different document
  649. > windows might have different contents.  Do I need to have a seperate MENU
  650. > resource for each document I want to open?  Or is there a way to create
  651. > independent menus from one resource?
  652. > I'm doing this within PowerPlant, though I don't think that matters.
  653.  
  654. You can have several PP windows referencing the same popup menu, if the
  655. menu contents stay the same.
  656. In my program, the popup menu is hierarchical, and its contents are built
  657. on the fly.  I use the NewMenu toolbox call for this, and I had to use a
  658. different menuID for each one.
  659.  
  660.  
  661. Jan                                  \|/
  662.                                     (o o)
  663. ________________________________oOo__(_)__oOo_________________________________
  664. |  Jan Bruyndonckx                                                           |
  665. |  e-mail: jbruyndonckx@waveresearch.com                                     |
  666. |  ALink:  WAVE.BEL                        "Small problems have deep roots." |
  667. l____________________________________________________________________________l
  668.  
  669. ---------------------------
  670.  
  671. >From Andy.Bettis@isltd.insignia.com (Andy Bettis)
  672. Subject: MacApp newbie questions
  673. Date: Mon, 22 Jan 1996 12:19:23 GMT
  674. Organization: Insignia Solutions
  675.  
  676. I'm new to MacApp and am trying to learn it by the home study method,
  677. however I'm hitting a few problems early on and I'd be grateful for some
  678. expert advice.
  679.  
  680. First off, after building my app it refuses to run, claiming that the
  681. required resources are not present. Is there a way of finding out what is
  682. missing? I've compared by generated resource fork with some of the working
  683. examples without spotting any obvious difficulties.
  684.  
  685. When constructing views with ViewEdit I can't add pop-up menus without a
  686. corresponding MENU resource in addition to the CMNU (it crashes horribly).
  687. And do I need to add pop-up menus to the hierarchic MBAR resource?
  688.  
  689. Can I directly change the fNumRows field in a TGridView subclass or do I
  690. need to  insert the number of rows I need one at a time? And how is a
  691. double-click selection passed to the app?
  692.  
  693. Finally, can anyone suggest a good 'how to' book? I'm OK on the C++ side
  694. of things, and I have the Apple programmer's guide and tutorial manuals.
  695.  
  696. Thanks in advance, and could you mail any replies as I'm not a regular in
  697. this group. Oh, by the way, I'm using CodeWarrior rather than MPW.
  698.  
  699. Rev. Andy
  700.  
  701. +++++++++++++++++++++++++++
  702.  
  703. >From trygve@kagi.com (Trygve Isaacson)
  704. Date: Tue, 23 Jan 1996 06:53:57 GMT
  705. Organization: Freak Accident Music
  706.  
  707. In article <Andy.Bettis-2201961222550001@abettis-mac.isltd.insignia.com>,
  708. Andy.Bettis@isltd.insignia.com (Andy Bettis) wrote:
  709.  
  710. > I'm new to MacApp and am trying to learn it by the home study method,
  711. > however I'm hitting a few problems early on and I'd be grateful for some
  712. > expert advice.
  713. > First off, after building my app it refuses to run, claiming that the
  714. > required resources are not present. Is there a way of finding out what is
  715. > missing? I've compared by generated resource fork with some of the working
  716. > examples without spotting any obvious difficulties.
  717.  
  718. This is commonly encountered by not including or initializing some of the
  719. MacApp managers needed at startup. Usually it's the UDialog unit or its
  720. resources.
  721.  
  722. So first, make sure you make these calls (you may not need them all, but
  723. this basically covers it) in your main before you create and run the
  724. application object:
  725.  
  726.    InitUMacApp(8);
  727.    InitUPrinting();
  728.    InitUTEView();
  729.    InitUDialog();
  730.    InitUMailer();
  731. #if qDrag
  732.    if (HasDragManager())
  733.       InitUDragManager();
  734. #endif
  735.    InitUGridView();
  736.    InitUSynchScroller();
  737.    InitUFloatWindow();
  738.  
  739. Second, make sure you include the necessary resources by putting the
  740. following lines in your main .r file (again, you may be able to omit some
  741. of these, but start with them all to be sure):
  742.  
  743. #if qDebug
  744. include "Debug.rsrc" not 'ckid';
  745. #endif
  746.  
  747. include "MacApp.rsrc" not 'ckid';
  748. include "Printing.rsrc" not 'ckid';
  749. include "Dialog.rsrc" not 'ckid';
  750. include "Defaults.rsrc" 'aete';
  751. include "Defaults.rsrc" 'CLSS';
  752.  
  753. // Include 68K Code Resources when Rezzing
  754. #if !qNoCode
  755. include $$Shell("ObjApp")$$Shell("XAppName") 'CODE';
  756. #endif
  757.  
  758. > When constructing views with ViewEdit I can't add pop-up menus without a
  759. > corresponding MENU resource in addition to the CMNU (it crashes horribly).
  760. > And do I need to add pop-up menus to the hierarchic MBAR resource?
  761.  
  762. Yes, put your popup CMNU ids in the hierarchical MBAR. You don't need any
  763. MENUs, although you can use them where you don't need command number
  764. mapping.
  765.  
  766. > Can I directly change the fNumRows field in a TGridView subclass or do I
  767. > need to  insert the number of rows I need one at a time? And how is a
  768. > double-click selection passed to the app?
  769.  
  770. You need to call TGridView methods such as InsRowBefore or InsRowFirst or
  771. InsRowLast. These all allow you to insert several rows with one call. You
  772. can't just alter fNumRows.
  773.  
  774. You need to handle double-clicks by overriding DoMouseCommand and checking
  775. the event's click count.
  776.  
  777. Good luck...
  778. ...........................................................................
  779. Trygve Isaacson                   "We secretly replaced this gourmet coffee
  780. trygve@kagi.com                    with Folger's Dilithium Crystals."
  781. www.kagi.com/authors/trygve/
  782. ...........................................................................
  783.  
  784. +++++++++++++++++++++++++++
  785.  
  786. >From Lev Knopov < Lev_Knopov@mail.stil.scitex.com>
  787. Date: 23 Jan 1996 07:17:51 GMT
  788. Organization: Scitex Corp. Ltd.
  789.  
  790. Andy.Bettis@isltd.insignia.com (Andy Bettis) wrote:
  791. >I'm new to MacApp and am trying to learn it by the home study method,
  792. >however I'm hitting a few problems early on and I'd be grateful for some
  793. >expert advice.
  794. >
  795. >First off, after building my app it refuses to run, claiming that the
  796. >required resources are not present. Is there a way of finding out what is
  797. >missing? I've compared by generated resource fork with some of the working
  798. >examples without spotting any obvious difficulties.
  799. >
  800. >When constructing views with ViewEdit I can't add pop-up menus without a
  801. >corresponding MENU resource in addition to the CMNU (it crashes horribly).
  802. >And do I need to add pop-up menus to the hierarchic MBAR resource?
  803. >
  804. >Can I directly change the fNumRows field in a TGridView subclass or do I
  805. >need to  insert the number of rows I need one at a time? And how is a
  806. >double-click selection passed to the app?
  807. >
  808. >Finally, can anyone suggest a good 'how to' book? I'm OK on the C++ side
  809. >of things, and I have the Apple programmer's guide and tutorial manuals.
  810. >
  811. >Thanks in advance, and could you mail any replies as I'm not a regular in
  812. >this group. Oh, by the way, I'm using CodeWarrior rather than MPW.
  813. >
  814. >Rev. Andy
  815.  
  816. Dear Andy,
  817.  
  818. First of all, there is a MacApp dedicated newsgroup : comp.sys.mac.oop.macapp3.
  819. Now , your questions :
  820. 1. MacApp is very depended on its resources. You need to include in your project
  821. MacApp.r,DIalog.r,Debug,r(for Debug version),Printing.r as minimum. And of
  822. course, you own resource build in ViewEdit. Do not forget to call
  823. MA_REGISTER_CLASS(in 3.3) or macroDontDeadStrip(in 3.1.4) for views you
  824. defined in ViewEdit. The only way to find out what is missing - debugger.
  825. 2. ViewEdit is not a best choice for MacApp views editing. Use Ad Lib
  826. instead. Yuo donnot need to duplicate menus in CMNU and MENU.
  827. 3.You need to insert num of rows you need.
  828. 4.Double-click does not supported in TGridView, but you can override
  829. DoMouseCommand of you view and examine TTolboxEvent for number of clicks.
  830. 5.Try to look on Apple MacApp examples - DemoText,DemoDialogs - it's a
  831. good examples of MacApp appplications.
  832. 6. CodeWarrior is, to my mind, the best choice. Use Rez compiler to
  833. compile MacApp resources.
  834.  
  835. Hope this helps
  836.  
  837. -- 
  838.   //\\   Lev Knopov
  839.   \\//   Scitex Israel
  840. ///  \\\ Lev_Knopov@mail.stil.scitex.com
  841.  
  842.  
  843. Lev Knopov
  844.  
  845. Lev_Knopov@mail.stil.scitex.com
  846. Scitex Israel
  847.  
  848.  
  849.  
  850. ---------------------------
  851.  
  852. >From mneylon@engin.umich.edu (Michael K. Neylon)
  853. Subject: Matching struct definitions to TMPL resources
  854. Date: 22 Jan 1996 14:21:11 GMT
  855. Organization: University of Michigan Engineering, Ann Arbor
  856.  
  857. I have a preferences structure in my program, which I read in from
  858. the data fork of my prefs file.  When generating this prefs file for
  859. a new user, I have a 'pref' resource and a 'TMPL' resource.  
  860. The latter should describe the order and size of each item in the 
  861. 'pref' resource, and then I set up the default values in the 'pref'
  862. resource.
  863.  
  864. However, I am having trouble synchonizing the prefs TMPL to the 
  865. prefs structure.  One of the problems is that I cannot find 
  866. anywhere where there is a full list of 4-letter codes that describe
  867. the types that can be used within the TMPL.  Also, I would think that
  868. I may need to do some struct alignment within my program, but again,
  869. I'm not sure if this is necessary, much less how to do it.
  870.  
  871. Any help with this would be appriciated...TIA...
  872.  
  873.  
  874.  
  875. -- 
  876.  Michael K. Neylon, Graduate Student           | "Pausing only to reconstruct
  877.  Dept. of ChE, Univ. of Michigan               |   the whole of integral 
  878.  mneylon@engin.umich.edu                       |   mathematics, he continues
  879.  http://www-personal.engin.umich.edu/~mneylon/ |   on..."    Marvin - tHGttG
  880.  
  881. +++++++++++++++++++++++++++
  882.  
  883. >From jeff@ntsi.com (Jeff Miller)
  884. Date: Thu, 25 Jan 1996 19:59:04 -0800
  885. Organization: Network TeleSystems, Inc.
  886.  
  887. In article <4e06gn$7a7@srvr1.engin.umich.edu>, mneylon@engin.umich.edu
  888. (Michael K. Neylon) wrote:
  889.  
  890. > However, I am having trouble synchonizing the prefs TMPL to the 
  891. > prefs structure.  One of the problems is that I cannot find 
  892. > anywhere where there is a full list of 4-letter codes that describe
  893. > the types that can be used within the TMPL. 
  894.  
  895. >From the ResEdit Reference book (I apologize for the formatting, I copied
  896. this from Acrobat):
  897.  
  898. These are the types you may choose from for your editable data fields:
  899. DBYT, DWRD, DLNG Decimal byte, decimal word, decimal long word
  900. HBYT, HWRD, HLNG Hex byte, hex word, hex long word
  901. AWRD, ALNG Word align, long align
  902. FBYT, FWRD, FLNG Byte fill, word fill, long fill (with 0)
  903. HEXD Hex dump of remaining bytes in resource (This can only be the last
  904. type in a resource.)
  905. PSTR Pascal string (length byte followed by the characters)
  906. LSTR Long string (length long followed by the characters)
  907. WSTR Same as LSTR, but a word rather than a long word
  908. ESTR, OSTR Pascal string padded to even or odd length (needed for DITL
  909. resources)
  910. CSTR C string (characters followed by a null)
  911. ECST, OCST Even-padded C string, or odd-padded C string (padded with nulls)
  912. BOOL Boolean (two bytes)
  913. Note
  914. Scrolling can become extremely slow if a template contains many BBIT or
  915. BOOL items.
  916. ResEdit does the appropriate type checking for you when you put the
  917. editing dialog window away.
  918. The template mechanism is flexible enough to describe a repeating sequence
  919. of items within a resource, as in 'STR#', 'DITL', and .'MENU' resources.
  920. You can also have repeating sequences within repeating sequences, as in
  921. 'BNDL' resources. To terminate a repeating sequence, put the appropriate
  922. code in the template as follows: BBIT Binary bit (There must be 8 or an
  923. even multiple of 8 of these; if fewer than 8 bits are defined, you must
  924. include placeholder bits.)
  925. TNAM Type name (four characters, like OSType and ResType)
  926. CHAR A single character
  927. RECT An 8-byte rectangle
  928. Hnnn A 3-digit hex number; displays nnn bytes in hex format
  929. Cnnn A C string that is nnn hex bytes long (The last byte is always a 0,
  930. so the string itself occupies the first nnn-1 bytes.)
  931. P0nn A Pascal string that is nn hex bytes long (The length byte is not
  932. included in nn, so the string occupies the entire specified length.)
  933. LSTZ
  934. LSTE List Zero–List End. Terminated by a 0 byte (as in 'MENU' resources).
  935. ZCNT
  936. LSTC
  937. LSTE Zero Count/List Count–List End. Terminated by a zero-based word count
  938. that starts the sequence (as in 'DITL' resources).
  939. OCNT
  940. LSTC
  941. LSTE One Count/List Count–List End. Terminated by a one-based word count
  942. that starts the sequence (as in 'STR#' resources).
  943. LSTB
  944. LSTE List Begin–List End. Ends at the end of the resource. (As in 'acur'
  945. and 'APPL' resources.)
  946. The LSTB (list-begin) code begins the repeating sequence of items, and the
  947. LSTE code is the end. Labels for these codes are usually set to the string
  948. "*****". Both of these codes are required. It is generally advisable to
  949. keep the beginning and ending labels identical to each other and to have
  950. them be no more than five characters long.
  951.  
  952. Jeff
  953.  
  954. - -----------------------------------------------------------
  955.  Jeff Miller  |  jeff@ntsi.com  |  Network TeleSystems, Inc.
  956. - -----------------------------------------------------------
  957.  
  958. ---------------------------
  959.  
  960. >From mrw@welchgate.welch.jhu.edu (mrw)
  961. Subject: Menu Manager limitations?
  962. Date: 20 Jan 1996 21:30:17 GMT
  963. Organization: Johns Hopkins University
  964.  
  965. I can't find this information in IM.
  966.  
  967. What is the limit to the number of items I can put in a 'MENU'
  968. resource?  I am displaying these items in a PowerPlant StdPopupmenu
  969. object.
  970.  
  971. Thanks in advance,
  972.  
  973. -marty
  974.  
  975. +++++++++++++++++++++++++++
  976.  
  977. >From jwbaxter@olympus.net (John W. Baxter)
  978. Date: Sat, 20 Jan 1996 20:52:30 -0800
  979. Organization: Internet for the Olympic Peninsula
  980.  
  981. In article <4drmt9$mcb@news.jhu.edu>, mrw@welchgate.welch.jhu.edu (mrw) wrote:
  982.  
  983. >I can't find this information in IM.
  984. >
  985. >What is the limit to the number of items I can put in a 'MENU'
  986. >resource?  I am displaying these items in a PowerPlant StdPopupmenu
  987. >object.
  988.  
  989. You can put any number of items (any number you're likely to want to) into
  990. a MENU resource as far as Inside Mac is concerned.  Only the first 31 can
  991. be enabled/disabled in the resource or in code, since only those have bits
  992. available in the 32-bit word in the resource and menu record which holds
  993. those flags.
  994.  
  995. (I think there's a signed 2-byte count, so 32767 is the limit, but you
  996. don't want that many, so it's moot.)
  997.  
  998.    --John
  999.  
  1000. -- 
  1001.   "Officials said the collision was caused by the fog, which was as thick as sea poop."
  1002. John W. Baxter    Port Ludlow, WA     jwbaxter@olympus.net
  1003.  
  1004. +++++++++++++++++++++++++++
  1005.  
  1006. >From pcastine@prz.tu-berlin.de (Peter Castine)
  1007. Date: Wed, 24 Jan 1996 11:05:58 +0100
  1008. Organization: Process Control Center, TU Berlin
  1009.  
  1010. In article <4drmt9$mcb@news.jhu.edu>, mrw@welchgate.welch.jhu.edu (mrw) wrote:
  1011.  
  1012. >What is the limit to the number of items I can put in a 'MENU'
  1013. >resource?  I am displaying these items in a PowerPlant StdPopupmenu
  1014. >object.
  1015.  
  1016. You will take serious performance hits (not to mention having created an
  1017. abysmal user interface) long before you get to the technical limits of the
  1018. number of items in a menu. 
  1019.  
  1020. There is a HIG recommendation to the effect that (with the exception of
  1021. dynamic menus, such as a Font menu) you shouldn't have more menu items
  1022. than what would fit _without_ scrolling on a 9" classic screen. This was
  1023. something like 17 or 21 items. Macs with 9" screens haven't been produced
  1024. for quite a while now, but there are still some around (I believe John
  1025. Norstrad's most valued UI-tester uses a Mac with 512x342 screen
  1026. resolution).
  1027.  
  1028. As to the technical limits: a look at the MenuInfo data structure suggests
  1029. the only limit is available memory; the Resource Manager has supported
  1030. resources > 32,767 bytes for years now. The implementation of Menu Manager
  1031. traps might put a limit at 32 or 16k items, but you'll have to do some ROM
  1032. disassembly to find out for sure (and even then, you never know what
  1033. future trap patches might do). 
  1034.  
  1035. Hope this helps,
  1036.  
  1037. Peter
  1038.  
  1039. - -------- For a good time, http://www.prz.tu-berlin.de/~pcastine ---------
  1040. Dr. Peter Castine           | Whenever I hear anyone arguing for slavery, I
  1041. pcastine@prz.tu-berlin.de   | feel a strong impulse to see it tried on him
  1042. Process Control Center      | personally.
  1043. Technical University Berlin |                            -- Abraham Lincoln
  1044.  
  1045. ---------------------------
  1046.  
  1047. >From hvision@pophost.eunet.be (hypervision)
  1048. Subject: Programming a PinnBall
  1049. Date: Tue, 02 Jan 1996 22:45:11 -0100
  1050. Organization: hypervision
  1051.  
  1052. A couple of days ago i finished my first (beta) pinball.
  1053. Collision detection, bouncing, gravity, multiple heigths, whatever... it
  1054. all works nice and fast. The only problem is that i have some problem with
  1055. the 'feel' of the game : the ball doesn't seem to make a really realistic
  1056. drop (although the algorithm is pure physics, and it is correct (i hope))
  1057.  
  1058. I guess the trick is to set the parameters correctly. So here i go :
  1059.  
  1060.    - when calculating gravity, i add (every 5 ticks or so) a small amount
  1061. to the ball's vertical velocity.  how much should i add ? (in terms of the
  1062. ball's size, which is variable and currently set to 40x40 pixs in a
  1063. 640x480 pinball arena)
  1064. I tried a bunch of values ranging from 0.5 to 1.5, but they all seem weird
  1065. (greater than 1.5 flips the ball out of the arena)
  1066.  
  1067.    - when the ball bounces an object, i calc the refraction vector and set
  1068. that to the new velocity of the ball. Should i scale this velocity also ?
  1069. How much would be a logical value (considering non-bouncing objects. i.e.
  1070. plain walls)
  1071.    - am i forgetting something crucial ?
  1072.  
  1073.  
  1074. If i ever finish this thing entirely (currenlty working on sounds and
  1075. moveable parts), i'll probably release the source code.
  1076.  
  1077. Thanks in advance
  1078.  
  1079. Grendel.
  1080.  
  1081. +++++++++++++++++++++++++++
  1082.  
  1083. >From jregier@qualcomm.com (Jason Regier)
  1084. Date: Tue, 02 Jan 1996 17:49:55 -0800
  1085. Organization: Qualcomm, Inc.
  1086.  
  1087. In article <hvision-0201962245110001@193.75.128.7>,
  1088. hvision@pophost.eunet.be (hypervision) wrote:
  1089.  
  1090. Re: getting a pinball simulator to simulate well:
  1091. >    - when calculating gravity, i add (every 5 ticks or so) a small amount
  1092. > to the ball's vertical velocity.  how much should i add ? (in terms of the
  1093. > ball's size, which is variable and currently set to 40x40 pixs in a
  1094. > 640x480 pinball arena)
  1095. > I tried a bunch of values ranging from 0.5 to 1.5, but they all seem weird
  1096. > (greater than 1.5 flips the ball out of the arena)
  1097. >
  1098. Well, I have no idea what kind of value is appropriate numerically, but
  1099. you can take some physical measurements and do some back-of-the-envelope
  1100. calculations to come up with a reasonable number.  Here's some tips to get
  1101. you started...
  1102.  
  1103. First of all, it doesn't matter if your ball is huge or not.  From
  1104. physics, you know F=ma, and the acceleration due to gravity is a constant
  1105. 9.8 m/s^2.  Now your ball isn't moving vertically through space, so you
  1106. know that it can't be effectively feeling the full force of gravity. 
  1107. Given the length of the pinball table and the height at the scoreboard
  1108. (both of which are easy to measure) you can compute the angle of tilt on
  1109. the pinball table using trigonometry.  Multiply the 9.8 m/s^2 for vertical
  1110. motion times the sine of the angle of tilt, and you'll have the effective
  1111. acceleration on the ball.
  1112.  
  1113. This number is in m/s^2, so you need to start converting units to get
  1114. things right.  Find an appropriate conversion factor between physical
  1115. lengths and pixel distances, and some constant time multiplier to get your
  1116. times right, and you should be all set.  You will have to tweak these
  1117. conversion factors to get the effect you want, but once you're all done,
  1118. it should hopefully look pretty good.
  1119.  
  1120. Of course, this is physics-dork way of doing things, and you might want to
  1121. just play with numbers instead (as you were doing) until something looks
  1122. cool.
  1123.  
  1124. >    - when the ball bounces an object, i calc the refraction vector and set
  1125. > that to the new velocity of the ball. Should i scale this velocity also ?
  1126. > How much would be a logical value (considering non-bouncing objects. i.e.
  1127. > plain walls)
  1128.  
  1129. You'd calculate the reflected velocity vector, and set the ball's new
  1130. velocity to that.  Realistically, you should scale this number by some
  1131. constant factor to account for the elasticity of the collision.  TOTMGPG
  1132. has some stuff on this, but the gist is this: if you multiply by an
  1133. elastic factor of 0, then your balls stops when it hits the object.  This
  1134. is an inelastic collision, and you definitely don't want that.  If you set
  1135. the elasticity to 1, then you ball doesn't lose any energy in the
  1136. collision, and it has the same speed entering and leaving.  Realistically,
  1137. you want your ball to lose a bit in the collision so try 0.8 or so for
  1138. that factor.
  1139.  
  1140. >    - am i forgetting something crucial ?
  1141. >
  1142. Just remember to be somewhat accurate in your calculations.  Nothing is
  1143. more annoying than a pinball game where it's REALLY easy to make the same
  1144. shot twice.
  1145.  
  1146. Good luck!
  1147. Jason
  1148.  
  1149. -- 
  1150. Jason Regier
  1151. GlobalStar Software Engineer
  1152. QUALCOMM, Inc.
  1153. (619) 658-4752
  1154. jregier@qualcomm.com
  1155.  
  1156. +++++++++++++++++++++++++++
  1157.  
  1158. >From jmunkki@beta.hut.fi (Juri Munkki)
  1159. Date: 3 Jan 1996 03:36:30 GMT
  1160. Organization: Helsinki University of Technology
  1161.  
  1162. In article <jregier-0201961749550001@jregier-mac.qualcomm.com> jregier@qualcomm.com (Jason Regier) writes:
  1163. >In article <hvision-0201962245110001@193.75.128.7>,
  1164. >hvision@pophost.eunet.be (hypervision) wrote:
  1165. >>    - am i forgetting something crucial ?
  1166.  
  1167. >Just remember to be somewhat accurate in your calculations.  Nothing is
  1168. >more annoying than a pinball game where it's REALLY easy to make the same
  1169. >shot twice.
  1170.  
  1171. For a good game of pinball, I would think that it would be important to
  1172. model ball spin as well. It's mathematically a bit tougher than the
  1173. collisions and motion without it, but it should be possible to take
  1174. shortcuts. For a really good implementation, I would think that
  1175. quaternions might come in handy.
  1176.  
  1177. I don't know if any computer pinball games model spin...all of the ones
  1178. that I have tried have felt more like video games rather than the real thing.
  1179.  
  1180. It may also be a good idea to run the simulation at an extremely high frame
  1181. rate (say 100-500 frames per second) and draw the results at around the
  1182. screen refresh rate (motion blurring the ball is a very good idea).
  1183.  
  1184. The material of the bumper should determine how the ball bounces off on
  1185. a collision. A very hard surface will conserve energy very well. A soft
  1186. surface will absorb the energy. A rubbery surface would first absorb the
  1187. energy and then bounce back, restoring the momentum (but not the spin).
  1188.  
  1189. Most computer pinballs seem to use brownian motion simulation to jitter
  1190. the ball so that it doesn't get stuck so easily. I don't like it when
  1191. they overdo it, but I guess it's a necessary evil.
  1192.  
  1193. -- 
  1194. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1195. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1196.  
  1197. +++++++++++++++++++++++++++
  1198.  
  1199. >From johnb@hk.super.net (John W. Blackburne)
  1200. Date: Wed, 03 Jan 1996 21:28:36 +0800
  1201. Organization: Tempest
  1202.  
  1203. In article <hvision-0201962245110001@193.75.128.7>,
  1204. hvision@pophost.eunet.be (hypervision) wrote:
  1205.  
  1206. :A couple of days ago i finished my first (beta) pinball.
  1207. :Collision detection, bouncing, gravity, multiple heigths, whatever... it
  1208. :all works nice and fast. The only problem is that i have some problem with
  1209. :the 'feel' of the game : the ball doesn't seem to make a really realistic
  1210. :drop (although the algorithm is pure physics, and it is correct (i hope))
  1211. :
  1212. :I guess the trick is to set the parameters correctly. So here i go :
  1213. :
  1214. :   - when calculating gravity, i add (every 5 ticks or so) a small amount
  1215. :to the ball's vertical velocity.  how much should i add ? (in terms of the
  1216. :ball's size, which is variable and currently set to 40x40 pixs in a
  1217. :640x480 pinball arena)
  1218. :I tried a bunch of values ranging from 0.5 to 1.5, but they all seem weird
  1219. :(greater than 1.5 flips the ball out of the arena)
  1220.  
  1221. First for realism you should have some sort of constant time base. One way
  1222. is to do your calcs at frequent fixed intervals, e.g. 20 times a second,
  1223. either by making sure your graphics can be done in 0.05 sec then waiting
  1224. between redraws until 0.05 sec later, or by having a time manager task
  1225. doing the velocity calcs independent of screen redraw every 0.05 sec.
  1226.  
  1227. If you find it difficult to do your calcualations at fixed times use the
  1228. time between your calculations in your calcuations as a scaling factor.
  1229. E.g. if your accn is m then use
  1230.  
  1231.        this_time = MyGetTime()
  1232.        v = v + m * (this_time - last_time)
  1233.        last_time = this_time
  1234.  
  1235. In the above m is acceleration due to gravity. On a sloped surface this
  1236. should be about 9.8 * sin (angle_of_slope) (m/s^2), scaled to fit it on
  1237. screen. (Both v and m are vectors, so the above is not real code in any
  1238. language I use.)
  1239.  
  1240. For added realism you could include a drag factor: this is probably not
  1241. very significant in pinball but it does act as a limiting factor on speed,
  1242. and so is noticable in some circumstances. Adding in a drag factor d to
  1243. the above formula you get
  1244.  
  1245.        v = v + (m - (d * v)) * (this_time - last_time)
  1246.  
  1247. The best value for d can be determined by trial an error, but it should
  1248. probably be a small number, e.g. 0.1. One guide is that the above equation
  1249. gives no change in velocity when (m - (d * v)) = 0, i.e. when v = m/d,
  1250. which will be the 'terminal' or maximum velocity of the ball as it rolls
  1251. down the sloped table.
  1252.  
  1253. You should do your calcuations at a much higher resolution than the screen
  1254. resolution, e.g. use fixed point or floating point arithmetic. Fixed point
  1255. is best where you're doing a lot of calcuations and can't rely on a
  1256. floating point co-porcessor being present, though with only one moving
  1257. object most of the time you might find floats easier. Then just take the
  1258. integer part when plotting to screen.
  1259.  
  1260. :   - when the ball bounces an object, i calc the refraction vector and set
  1261. :that to the new velocity of the ball. Should i scale this velocity also ?
  1262. :How much would be a logical value (considering non-bouncing objects. i.e.
  1263. :plain walls)
  1264.  
  1265. The easiset way is probably to use surface normals, then do something like
  1266.  
  1267.       v = v - n * ((v.n) * (1 + e))
  1268.  
  1269. n is the unit normal vector, the '.' is a dot product, and e is the
  1270. coefficient of resitution. You then just need a table of n and e for each
  1271. surface. As Juri noted the amount of reflection will vary for different
  1272. surfaces, from e=0 for no bounce to e=1 for a perfect bounce, with no
  1273. energy lost. Again experiment to see what is best.
  1274.  
  1275. You might also want to include spin, but this makes it a fair bit more
  1276. complex, as at each colision you'd want to not only check how much spin
  1277. effected the impact (typically by ginving it a boost along the surface)
  1278. but also how much the surface affected he spin, which would depend on the
  1279. surface and the angle of impact. Spin would also effect it's trajectory.
  1280.  
  1281. :   - am i forgetting something crucial ?
  1282.  
  1283. Magnets. Some of the most fun pinball games I've played have had magnets,
  1284. or even better electro-magnets, invisibly embedded in the playing surface.
  1285. Note that I am not a very good pinball player, so the degree of randomness
  1286. such would introduce did not bother me.
  1287.  
  1288. Tilt. Not sure how you'd do this, I've seen a couple of computer
  1289. implementations, neither of them impressed me.
  1290.  
  1291. Pits/ramps. You could use most of the calculations above but would want to
  1292. vary both the magnitude and direction of the vector m.
  1293.  
  1294. John
  1295. -- 
  1296. John Blackburne,                     johnb@tempest.net.hk
  1297. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  1298. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  1299.  
  1300. +++++++++++++++++++++++++++
  1301.  
  1302. >From jregier@qualcomm.com (Jason Regier)
  1303. Date: Wed, 03 Jan 1996 10:15:14 -0800
  1304. Organization: Qualcomm, Inc.
  1305.  
  1306. In article <johnb-0301962128360001@0.0.0.0>, johnb@hk.super.net (John W.
  1307. Blackburne) wrote:
  1308.  
  1309. > Adding in a drag factor d to the above formula you get
  1310. >        v = v + (m - (d * v)) * (this_time - last_time)
  1311. I think you might get more "realistic" results if you tried d * v^2 and
  1312. made d a small number.  If you make d too high, it will look like playing
  1313. pinball in a viscous medium like oil, which is a pretty strange effect. 
  1314. Honestly, you might want to scrap drag altogether.  The drag on a pinball
  1315. is pretty darn small-- most of your energetic losses occur when you hit
  1316. objects like bumpers and targets.
  1317.  
  1318. Juri, you brought up spin.  Spin would be REALLY cool to see implemented. 
  1319. But are you sure that you'd want to use quaternions?  Quaternions are
  1320. great for doing rotations in 3D space, but for a top-down pinball game
  1321. (like all the ones I've seen) you don't have 3 angles of rotation to deal
  1322. with.  There should be only 2: one in the vertical plane, and one in the
  1323. horizontal plane (horizontal meaning in the plane of the screen, and
  1324. vertical meaning perpendicular to the screen).  If you further assume that
  1325. all your bumpers and flippers make contact with the ball through the
  1326. center of the ball, then you can't really impart any weird spin in the
  1327. vertical direction, so the problem pretty much reduces down to one angle. 
  1328. You can calculate the amount of horizontal spin by simply looking at where
  1329. the ball contacts an object, the rotational moment of inertia for a
  1330. sphere, and some physics.
  1331.  
  1332. > Magnets.
  1333. Way cool, and probably pretty easy to add.  Just assume some 1/r^2 force
  1334. relation for your "point" magnetic source (where r is the distance between
  1335. the ball and the magnet).  This just appears as another acceleration
  1336. acting on your ball when you go to calculate the ball's next position and
  1337. velocity vectors.  And when the magnet's not on, the force/acceleration
  1338. disappears.
  1339.  
  1340. > Tilt. Not sure how you'd do this, I've seen a couple of computer
  1341. > implementations, neither of them impressed me.
  1342. >
  1343. I'd guess that you check to see if you're within some distance of an
  1344. object.  If you are, then make the ball hit the wall.  Tilting and
  1345. slapping is more like imparting an impulse to the ball, which corresponds
  1346. to an instantaneous change in velocity.  If you are slamming the pinball
  1347. table forward (i.e. vertically on the screen), then when calculate the
  1348. collision, SUBTRACT some number from the ball's vertical velocity when
  1349. calculating the collision.  Likewise, if you slap on the left of the
  1350. table, when you do the collision, make the ball appear as if it were
  1351. really traveling faster towards the left than it really is.
  1352.  
  1353. > Pits/ramps. You could use most of the calculations above but would want to
  1354. > vary both the magnitude and direction of the vector m.
  1355. For pits and ramps, you could probably get away with faking it.  It seems
  1356. pretty silly to me to make all your calculations in 3D just because you
  1357. add one ramp.  Here's how I'd fake a ramp:  I basically am envisioning a
  1358. two-state system, where you're either on the ramp or you're not... let a
  1359. boolean variable RAMP (one for each ball) keep track of this.  As the ball
  1360. passes through the entrance to a ramp, toggle RAMP appropriately.  Thus,
  1361. if you never pass through the entrance, RAMP is 0, indicating that you
  1362. never made it up the ramp, and your game progresses normally.  If RAMP is
  1363. 1, then you're on the ramp.  Draw appropriately, and add forces when on
  1364. the ramp to simulate the hump that you have to get over to stay on the
  1365. ramp.
  1366.  
  1367. This a pretty cool discussion!
  1368.  
  1369. Later,
  1370. Jason
  1371.  
  1372. -- 
  1373. Jason Regier
  1374. GlobalStar Software Engineer
  1375. QUALCOMM, Inc.
  1376. (619) 658-4752
  1377. jregier@qualcomm.com
  1378.  
  1379. +++++++++++++++++++++++++++
  1380.  
  1381. >From jmunkki@beta.hut.fi (Juri Munkki)
  1382. Date: 4 Jan 1996 02:30:28 GMT
  1383. Organization: Helsinki University of Technology
  1384.  
  1385. In article <jregier-0301961015140001@jregier-mac.qualcomm.com> jregier@qualcomm.com (Jason Regier) writes:
  1386. >Juri, you brought up spin.  Spin would be REALLY cool to see implemented. 
  1387. >But are you sure that you'd want to use quaternions?  Quaternions are
  1388. >great for doing rotations in 3D space, but for a top-down pinball game
  1389. >(like all the ones I've seen) you don't have 3 angles of rotation to deal
  1390. >with.  There should be only 2: one in the vertical plane, and one in the
  1391. >horizontal plane (horizontal meaning in the plane of the screen, and
  1392. >vertical meaning perpendicular to the screen).  If you further assume that
  1393. >all your bumpers and flippers make contact with the ball through the
  1394. >center of the ball, then you can't really impart any weird spin in the
  1395. >vertical direction, so the problem pretty much reduces down to one angle. 
  1396. >You can calculate the amount of horizontal spin by simply looking at where
  1397. >the ball contacts an object, the rotational moment of inertia for a
  1398. >sphere, and some physics.
  1399.  
  1400. I didn't give it too much thought, so maybe quaternions are overkill,
  1401. but it seemed to me that spin would affect the ball motion when it
  1402. was traveling (touching only at the bottom), so you would want to
  1403. know the distance and direction it has rotated at the bottom and
  1404. bleed some of that into the acceleration or deceleration fo the ball.
  1405. This also goes the other way: some of the ball speed is converted
  1406. into rotational energy. If the spin of the ball is in synch with
  1407. the motion, no energy transfer happens.
  1408.  
  1409. Then, when the ball hits an obstacle, it might be necessary to get the
  1410. rotation in the same manner, but against the surface that it hit.
  1411.  
  1412. Spin is one of the reasons why the ball may fly up when it hits an
  1413. obstacle: the ball rotation is converted into upward motion.
  1414.  
  1415. I think rotational physics are my weakest area, so you may be right
  1416. and I might be wrong. Still, I'm sure quaternions would guarantee
  1417. the correct results whereas taking shortcuts could produce more
  1418. complicated code that doesn't quite match reality.
  1419.  
  1420. -- 
  1421. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1422. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1423.  
  1424. +++++++++++++++++++++++++++
  1425.  
  1426. >From jregier@qualcomm.com (Jason Regier)
  1427. Date: Thu, 04 Jan 1996 10:05:23 -0800
  1428. Organization: Qualcomm, Inc.
  1429.  
  1430. In article <4cfe44$7ne@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  1431. > I didn't give it too much thought, so maybe quaternions are overkill,
  1432. > but it seemed to me that spin would affect the ball motion when it
  1433. > was traveling (touching only at the bottom), so you would want to
  1434. > know the distance and direction it has rotated at the bottom and
  1435. > bleed some of that into the acceleration or deceleration fo the ball.
  1436. Since we're kinda assuming that there is negligible friction between the
  1437. ball and the waxed pinball table, then the spin of the pinball won't
  1438. affect the way the ball moves across the surface of the table.  If you
  1439. assume that there is some friction, then you're right, the spin of the
  1440. ball will affect its motion across the table.
  1441.  
  1442. But regardless of table friction, the spin of the ball WILL affect its
  1443. path after a collision.  And like you said, this would produce a variety
  1444. of neat, strange effects.  Given the rotational and translational
  1445. velocities of the ball prior to the collision, you can find it's starting
  1446. energy.  If the collision is say, 80% elastic, you know that your energy
  1447. after the collision is %80 of the starting energy.  The trick is
  1448. determining how much of that final energy goes into translational motion
  1449. and how much goes into rotational motion.
  1450.  
  1451. Oh, and I just think quaternions seem like overkill because they're
  1452. designed for rotations in 3D space.  If you take the top-down view, then
  1453. like I said before, the only angle you really care about is rotation in
  1454. the plane of the table.
  1455.  
  1456. > Still, I'm sure quaternions would guarantee the correct results whereas
  1457. taking > shortcuts could produce more complicated code that doesn't quite
  1458. match 
  1459. > reality.
  1460. >
  1461. Yep, you may be right.
  1462.  
  1463. Jason
  1464.  
  1465. -- 
  1466. Jason Regier
  1467. GlobalStar Software Engineer
  1468. QUALCOMM, Inc.
  1469. (619) 658-4752
  1470. jregier@qualcomm.com
  1471.  
  1472. +++++++++++++++++++++++++++
  1473.  
  1474. >From jmunkki@beta.hut.fi (Juri Munkki)
  1475. Date: 5 Jan 1996 01:13:50 GMT
  1476. Organization: Helsinki University of Technology
  1477.  
  1478. In article <jregier-0401961005230001@jregier-mac.qualcomm.com> jregier@qualcomm.com (Jason Regier) writes:
  1479. >Since we're kinda assuming that there is negligible friction between the
  1480. >ball and the waxed pinball table, then the spin of the pinball won't
  1481. >affect the way the ball moves across the surface of the table.  If you
  1482. >assume that there is some friction, then you're right, the spin of the
  1483. >ball will affect its motion across the table.
  1484.  
  1485. I would think that the friction between the ball and table can be
  1486. considerable, if the ball is not rolling on the surface. If the spin
  1487. is left out and the friction with the the table is left out, you
  1488. don't have a pinball game: you get a weird sort of air hockey or
  1489. "shufflepuck" game.
  1490.  
  1491. If you want to see ball spin affecting its trajectory on a table,
  1492. take a look at the Williams pinball Whirlwind. The ball acts like
  1493. it is drunk after a few spins in the whirlwind.
  1494.  
  1495. My advice to the person who was writing this pinball is: learn the
  1496. physics, do the math and impress everyone by the incredible realism.
  1497.  
  1498. -- 
  1499. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1500. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1501.  
  1502. +++++++++++++++++++++++++++
  1503.  
  1504. >From Robert Grant <grant@informix.com>
  1505. Date: Fri, 05 Jan 1996 13:27:39 -0800
  1506. Organization: Informix Software, Inc. Menlo Park, CA 94025
  1507.  
  1508. All this spin stuff is interesting, but how is the interaction
  1509. with the flipper handled? Something that is very common in
  1510. pinball is catching the ball with the flipper and then letting
  1511. it roll down before flipping it back up the table - hopefully
  1512. at the desired angle. This seems to me to be fairly
  1513. complicated or am I missing something?
  1514.  
  1515. Robert.
  1516.  
  1517. +++++++++++++++++++++++++++
  1518.  
  1519. >From jmunkki@beta.hut.fi (Juri Munkki)
  1520. Date: 6 Jan 1996 03:18:37 GMT
  1521. Organization: Helsinki University of Technology
  1522.  
  1523. In article <30ED97CB.3401@informix.com> Robert Grant <grant@informix.com> writes:
  1524. >All this spin stuff is interesting, but how is the interaction
  1525. >with the flipper handled? Something that is very common in
  1526. >pinball is catching the ball with the flipper and then letting
  1527. >it roll down before flipping it back up the table - hopefully
  1528. >at the desired angle. This seems to me to be fairly
  1529. >complicated or am I missing something?
  1530.  
  1531. Laws of physics are not really complicated. Yet, if you try to take
  1532. shortcuts, the shortcuts can become complicated.
  1533.  
  1534. A very high internal frame rate combined with rotational energy
  1535. calculations should make the flipper interaction realistic.
  1536.  
  1537. The roll of the ball keeps it glued to the flipper and guide.
  1538.  
  1539. -- 
  1540. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1541. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  1542.  
  1543. +++++++++++++++++++++++++++
  1544.  
  1545. >From slamtilt@mcs.com (Samuel Zehr)
  1546. Date: Sat, 06 Jan 1996 02:09:18 -0600
  1547. Organization: Pixie Enterprises
  1548.  
  1549. In article <4chu0e$nca@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  1550.  
  1551. > In article <jregier-0401961005230001@jregier-mac.qualcomm.com>
  1552. jregier@qualcomm.com (Jason Regier) writes:
  1553. > >Since we're kinda assuming that there is negligible friction between the
  1554. > >ball and the waxed pinball table, then the spin of the pinball won't
  1555. > >affect the way the ball moves across the surface of the table.  If you
  1556. > >assume that there is some friction, then you're right, the spin of the
  1557. > >ball will affect its motion across the table.
  1558. > I would think that the friction between the ball and table can be
  1559. > considerable, if the ball is not rolling on the surface. If the spin
  1560. > is left out and the friction with the the table is left out, you
  1561. > don't have a pinball game: you get a weird sort of air hockey or
  1562. > "shufflepuck" game.
  1563. Actually, the ball doesn't roll as much as you would think - it glides.
  1564. That's what makes pinball so non-obvious. The ball is on a mylar surface,
  1565. so the spin of the ball can easily be opposite to the direction of
  1566. movement. In a factory new pinball game, the ball really shouldn't 'roll'
  1567. at all...
  1568. sz
  1569.  
  1570. -- 
  1571. Samuel Zehr               "My mom said it looked like a 
  1572. Anonymous title            pretty little rose"
  1573. Anonymous company              --Bernd Meierbachtol
  1574.  
  1575. +++++++++++++++++++++++++++
  1576.  
  1577. >From jhs@olden.Princeton.EDU (James Shaw)
  1578. Date: 11 Jan 1996 15:24:26 GMT
  1579. Organization: Computer Science Department, Princeton University
  1580.  
  1581. Jason Regier writes:
  1582. > This a pretty cool discussion!
  1583.  
  1584. Agreed.  I've also been working on a shapes engine to support pinball
  1585. as well as some other physically based games.  I've got the basic
  1586. collision detection for most important shapes in but I've only got the
  1587. typical simple rotationless physics.  
  1588.  
  1589. I'd like to continue this discussion (either in news or in email)
  1590. of the solutions (and implementations) of spin and rotation.
  1591.  
  1592. Juri started it out with:
  1593.  > For a good game of pinball, I would think that it would be important
  1594. to
  1595.  > model ball spin as well. It's mathematically a bit tougher than the
  1596.  > collisions and motion without it, but it should be possible to take
  1597.  > shortcuts. For a really good implementation, I would think that
  1598.  > quaternions might come in handy.
  1599.  
  1600. And Jason continues with:
  1601.  > Juri, you brought up spin.  Spin would be REALLY cool to see
  1602. implemented. 
  1603.  [ Discussion of quaternions deleted. ]
  1604.  
  1605. I'll agree with Juri; I think quaternions are needed.  There are three
  1606. angles of rotation:  spin (e.g. from top view the ball acts like a top),
  1607. rolling (the balls rotational motion in the direction it is moving) and
  1608. "english" or anti-rolling (the rotation part perpendicular to the balls
  1609. direction which takes it off course). 
  1610.  
  1611. For example, from an unmoving ball getting struck by the plunger,
  1612. shouldn't the need to start rotating, bleed some translational
  1613. energy away.  And the big question: how does rolling bounce?
  1614.  
  1615. Also, even if quaternions aren't needed for pinball.  How about
  1616. a realistic billiards game?  
  1617.  
  1618. Juri continued with:
  1619.  > If you want to see ball spin affecting its trajectory on a table,
  1620.  > take a look at the Williams pinball Whirlwind. The ball acts like
  1621.  > it is drunk after a few spins in the whirlwind.
  1622.  
  1623.  > My advice to the person who was writing this pinball is: learn the
  1624.  > physics, do the math and impress everyone by the incredible realism.
  1625.  
  1626. Good suggestion.  I'd like to take you up on it but, better yet,
  1627. I'd like to get a small list of people who would like to discuss
  1628. this in detail.  I'll be happy to start with my guess of the physics
  1629. but I'd like others to discuss it with and to check my work.
  1630. I'm hoping that either Juri or Jason or both would be interested,
  1631. but also any lurkers who think that they can contribute.
  1632.  
  1633. Interested?  Please email me, or just continue the thread.
  1634.  
  1635. Best,
  1636. James
  1637. jhs@cs.princeton.edu
  1638.  
  1639.  
  1640. +++++++++++++++++++++++++++
  1641.  
  1642. >From pottier@bireme.ens.fr (Francois Pottier)
  1643. Date: 11 Jan 1996 19:54:53 GMT
  1644. Organization: Ecole Normale Superieure, Paris
  1645.  
  1646. In article <4d3a3a$7na@cnn.Princeton.EDU>,
  1647. James Shaw <jhs@olden.Princeton.EDU> wrote:
  1648.  
  1649. >I'll agree with Juri; I think quaternions are needed.  There are three
  1650. >angles of rotation:
  1651.  
  1652. How are quaternions used for modelling rotations? In classical
  1653. physics any rotation is usually represented by a vector W, and a
  1654. vector product is used to compute the image of a given vector
  1655. by the rotation, i.e. after a time t, vector X becomes
  1656. Wt /\ X. 
  1657.  
  1658. (W is actually called a pseudo-vector because it is dependent on the
  1659. choice of a direct base, but that is a physical consideration which
  1660. isn't very important for modelling).
  1661.  
  1662. As far as I know quaternions are elements of a non-commutative
  1663. field H. How can they be used for rotations.
  1664.  
  1665. It's been a few years since I left the physics class...
  1666.  
  1667. -- 
  1668. Francois
  1669. pottier@dmi.ens.fr
  1670. http://www.eleves.ens.fr:8080/home/pottier/
  1671.  
  1672. +++++++++++++++++++++++++++
  1673.  
  1674. >From jmunkki@beta.hut.fi (Juri Munkki)
  1675. Date: 12 Jan 1996 11:09:56 GMT
  1676. Organization: Helsinki University of Technology
  1677.  
  1678. In article <4d3pud$p77@nef.ens.fr> pottier@bireme.ens.fr (Francois Pottier) writes:
  1679. >How are quaternions used for modelling rotations?
  1680.  
  1681. SIGGGraph'85, page 245: "Animating Rotations with Quaternion Curves" by
  1682. Ken Shoemake. It mostly deals with interpolating rotations using
  1683. quaternions, but provides a lot of references and a basic discussion
  1684. of how quaternions convert to rotation.
  1685.  
  1686. The Graphics Gems book series also has a lot of articles on quaternions.
  1687. I still only have the first book (shame on me), but it has a basic discussion
  1688. of quaternions on page 498: "Using Quaternions for Coding 3D Transformations"
  1689. by Patrick-Gilles Maillot. The source code is available on anonymous ftp.
  1690.  
  1691. -- 
  1692. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1693. http://www.iki.fi/jmunkki                  Windsurfing: Faster than the wind.
  1694.  
  1695. +++++++++++++++++++++++++++
  1696.  
  1697. >From jregier@qualcomm.com (Jason Regier)
  1698. Date: Mon, 15 Jan 1996 16:36:03 -0800
  1699. Organization: Qualcomm, Inc.
  1700.  
  1701. In article <4d3a3a$7na@cnn.Princeton.EDU>, jhs@olden.Princeton.EDU (James
  1702. Shaw) wrote:
  1703. > I'll agree with Juri; I think quaternions are needed.  There are three
  1704. > angles of rotation:  spin (e.g. from top view the ball acts like a top),
  1705. > rolling (the balls rotational motion in the direction it is moving) and
  1706. > "english" or anti-rolling (the rotation part perpendicular to the balls
  1707. > direction which takes it off course). 
  1708. First of all, quaternions are 4 component vectors with some really neat
  1709. properties that lend themselves quite nicely to rotations, especially in
  1710. 3D graphical systems.  I don't know nearly as much about these as I could
  1711. or probably should, but for more info, check out more advanced 3D Computer
  1712. Graphics books.  Also, Embedded Systems magazine has had several extensive
  1713. articles in the past about rotations with quaternions, most of them called
  1714. something like "The Spin Doctors".  If I understand correctly, quaternions
  1715. basically give you some powerful alternatives to dealing with Euler
  1716. angles.
  1717.  
  1718. If you're dealing with 2D systems, I get the strong impression that
  1719. quaternions may be a little heavy duty for the job.  Physically, if you
  1720. apply a force through the center of mass of an object, you're imparting
  1721. purely translational energy and zero rotational energy.  But we all know
  1722. that frictional forces act at the edge of a ball, so there's bound to be
  1723. some energy going into the rotation of the pinball as it moves across the
  1724. playing surface.
  1725.  
  1726. But the question is can you see those 3 dimensions of spin on a pinball in
  1727. real life?  I can't.  I can see when somebody spins the ball really fast
  1728. (i.e. Whirlwind) and it dances around like a top.  But I've never seen a
  1729. pinball react to some backspin like a cue ball does on a pool table. 
  1730. Thus, if I were modelling a pinball game, I'd ignore backspin and only
  1731. simulate the spin I could see in the real world.
  1732.  
  1733. > Also, even if quaternions aren't needed for pinball.  How about
  1734. > a realistic billiards game?  
  1735. Well, that's a different story.  I don't think there's really any way you
  1736. can do a realistic billiards game without taking into account all the
  1737. directions of english.  (You might think there's only back/topspin and
  1738. side english, but masse and jump shots can produce spin in the 3rd
  1739. direction).  Sounds to me like quaternions might be really handy here. 
  1740. And I'd love to see a great pool game-- I've yet to check out Virtual
  1741. Pool.  Anybody know if it's good?
  1742.  
  1743. Jason
  1744.  
  1745. -- 
  1746. Jason Regier
  1747. GlobalStar Software Engineer
  1748. QUALCOMM, Inc.
  1749. (619) 658-4752
  1750. jregier@qualcomm.com
  1751.  
  1752. +++++++++++++++++++++++++++
  1753.  
  1754. >From johnb@hk.super.net (John W. Blackburne)
  1755. Date: Tue, 16 Jan 1996 19:12:45 +0800
  1756. Organization: Tempest
  1757.  
  1758. In article <jregier-1501961636030001@jregier-mac.qualcomm.com>,
  1759. jregier@qualcomm.com (Jason Regier) wrote:
  1760.  
  1761. :But the question is can you see those 3 dimensions of spin on a pinball in
  1762. :real life?  I can't.  I can see when somebody spins the ball really fast
  1763. :(i.e. Whirlwind) and it dances around like a top.  But I've never seen a
  1764. :pinball react to some backspin like a cue ball does on a pool table. 
  1765. :Thus, if I were modelling a pinball game, I'd ignore backspin and only
  1766. :simulate the spin I could see in the real world.
  1767.  
  1768. I would forget about backspin on this too. Apart from it being invisible
  1769. it would not appear because of the dynamics. You can get sidespin from a
  1770. ball striking a rough barrier at a shallow angle. To get backspin you
  1771. would need to either have the ball contact a barrier on a point on the top
  1772. or bottom. You could do that with a barrier like this
  1773.  
  1774.                           _________
  1775.                           \
  1776.                    --------
  1777.  
  1778.  (or something even steeper) but how many of these do you see on a pinball
  1779. table ? Or you could 'flick' a ball off a barrier, as you can with a
  1780. marble by pushing down with it under the edge og your thumb, but again
  1781. does this mak sense on a pinball table.
  1782.  
  1783. I'm not even sure sidespin would be necessary. I recently downloaded the
  1784. demo of the Mac pinball game 'Loony Labyrinth', and while watching it run
  1785. in demo mode I carefully looked out for any sign of spin, and could see
  1786. none, as far as I could tell.
  1787.  
  1788. But it's a fine game. What makes it so ? A varied, interesting,
  1789. multi-level table, excellent graphics and sound and very smooth gameplay,
  1790. with very straighforward mechanics as far as I could tell.
  1791.  
  1792. John
  1793. -- 
  1794. John Blackburne,                     johnb@tempest.net.hk
  1795. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  1796. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  1797.  
  1798. +++++++++++++++++++++++++++
  1799.  
  1800. >From jinjur@kudonet.com (john calhoun)
  1801. Date: 18 Jan 1996 04:21:00 GMT
  1802. Organization: Scheherazade Software
  1803.  
  1804. In article <DL8Crv.37r@olsen.ch>, james@olsen.ch (James Shaw) wrote:
  1805.  
  1806. > This had an interesting effect on the simulation.  I had to
  1807. > define how elastic collisions worked for a ball striking a surface.
  1808. > I ruled that the spin reverses along the normal, just like translational
  1809. > motion.  It can be anywhere from inelastic to elastic just like
  1810. > translational collisions.  I have this image in my head of a rolling
  1811. > gear catching against the side of something and bouncing back, but
  1812. > otherwise, don't know if this bouncing is physically valid.  Comments?
  1813.  
  1814. Doesn't sound right.  If the ball is spinning like a top when it collides
  1815. with a barrier, you would expect the angle of deflection (off the barrier)
  1816. to be modified and (perhaps) the spin to completely stop at the instant of
  1817. collision (giving over it's rotational momentum to a change in direction
  1818. of the ball).  Imagine a billiard ball spinning like a top hitting a side
  1819. rail dead on (perpindicular), it shouldn't bounce straight back along the
  1820. path of incidence - it should instead come off at some angle.  For the
  1821. instant at which the side of the ball contacts the side rail (assuming
  1822. friction and thus elasticity) there will be a sudden torque that converts
  1823. into a translational (no longer rotational) force.  I think the velocity
  1824. the ball was going when it struck the rail (how hard it pressed into the
  1825. rail) and the the coefficent of friction between the ball and the rail
  1826. would determine both the maginitude of the torque moment and thus the
  1827. degree to which the spin was reduced.
  1828.  
  1829. > Rolling had the effect of, with gravity, losing energy in the system.
  1830. > This was at least in my implementation.   I had an explanation in
  1831. > my head why this would happen but I can't explain it at the moment.
  1832.  
  1833. I don't understand your wording on this for several reasons.  I don't see
  1834. how gravity causes a thig to "lose" energy, nor do I see how rollinf or
  1835. spin would either.  Now, if a ball has back soin that is slowly translated
  1836. into translational motion, I would expect some friction between the ball
  1837. and the surface and thus some heat produced.  Perhaps this is what you
  1838. meant by a loss of energy in the system.
  1839.  
  1840. > I didn't do anything with the interaction of the 3 directions of
  1841. > rotation.  I think they are independent but I don't have a physical
  1842. > arguement yet.
  1843.  
  1844. I don't buy into that exactly.  There is a definite "gyroscope" action
  1845. going on that will prevent a spinning top (or ball) from rolling over, but
  1846. friction with the surface the ball is on might tend to erode that.  Get a
  1847. ball spinning like a top on a coffee table, and then pick up one end of
  1848. the coffee table.  You expect the incline to start the ball sliding down
  1849. the table - and you expect as well the ball to try and maintain it's
  1850. original spin.  But how would the friction of sliding down the table act
  1851. on the ball?  Would that small moment of force start to tip the balls
  1852. spin?
  1853.  
  1854. Sounds like you might just need to tweak your system a bit and you'll have it.
  1855.  
  1856. john calhoun-
  1857.  
  1858. +++++++++++++++++++++++++++
  1859.  
  1860. >From jmunkki@beta.hut.fi (Juri Munkki)
  1861. Date: 18 Jan 1996 00:39:40 GMT
  1862. Organization: Helsinki University of Technology
  1863.  
  1864. In article <DL8Crv.37r@olsen.ch> james@olsen.ch (James Shaw) writes:
  1865. >If anyone else is interested, I'd like to start an email discussion of
  1866. >the physics.  There are enough mistakes that can be made so multiple
  1867. >participants would be helpful.
  1868.  
  1869. I think the topic is very suitable for the newsgroup, so I would keep
  1870. the discussion alive here and let everyone contribute.
  1871.  
  1872. I'm extremely tied up with Avara, so any time spent here comes from
  1873. my recreational time quota and shouldn't involve "deep thought". ;)
  1874.  
  1875. I'm glad you tried the spin and I'm glad you like the results. Even
  1876. if it is not absolutely correct, the added twist of handling spin
  1877. (does that count as pun?) will probably be appreciated by people who
  1878. play your game.
  1879.  
  1880. It still seems to me that quaternions would provide the ideal simple
  1881. solution for handling all kinds of spin: with any kind of motion
  1882. you'll have just a surface normal for the surface that you are
  1883. hitting or touching, a motion vector and a quaternion. The tough
  1884. part is then handling the situation where the ball bounces up from
  1885. the 2D plane.
  1886.  
  1887. But as with anything else having to do with rotations, quaternions
  1888. are just one solution. I haven't used them much (just some rotation
  1889. interpolations for objects and camera motion in 3D), but I have a
  1890. feeling that they would be the elegant solution for pinballs as well.
  1891.  
  1892. As long as you have a limited amount of balls (say under 10), most
  1893. machines should be able to handle any kind of math you want to throw
  1894. at them.
  1895.  
  1896. -- 
  1897. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  1898. http://www.iki.fi/jmunkki                  Windsurfing: Faster than the wind.
  1899.  
  1900. +++++++++++++++++++++++++++
  1901.  
  1902. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  1903. Date: 19 Jan 1996 03:06:53 GMT
  1904. Organization: Royal Institute of Technology, Stockholm, Sweden
  1905.  
  1906. In article <4dk4sc$1a8@nntp.hut.fi> jmunkki@beta.hut.fi (Juri Munkki) writes:
  1907. > As long as you have a limited amount of balls (say under 10), most
  1908. > machines should be able to handle any kind of math you want to throw
  1909. > at them.
  1910.  
  1911. Hmm, what's the greatest number of balls simultaneously in play ever used
  1912. in a physical pinball machine?  And if I ask this in rec.games.pinball,
  1913. will they laugh at me? :-)
  1914.  
  1915.  
  1916. /Bo Lindbergh
  1917.  
  1918.  
  1919. +++++++++++++++++++++++++++
  1920.  
  1921. >From james@olsen.ch (James Shaw)
  1922. Date: Mon, 15 Jan 1996 16:07:07 GMT
  1923. Organization: Olsen & Associates AG, Zurich, Switzerland
  1924.  
  1925. I said earlier:
  1926.  > I'll agree with Juri; I think quaternions are needed.  There are three
  1927.  > angles of rotation:  spin (e.g. from top view the ball acts like a top),
  1928.  > rolling (the balls rotational motion in the direction it is moving) and
  1929.  > "english" or anti-rolling (the rotation part perpendicular to the balls 
  1930.  > direction which takes it off course). 
  1931.  
  1932. I take it back.  Quaternions are not needed.  I implemented rolling,
  1933. english and spinning this weekend and needed only a 3D vector to
  1934. store them.  Of course, if I wanted to display the rolling object's
  1935. absolute position, I would need a rotation matrix or quaternions,
  1936. but for the spin's velocity, I only needed one vector.
  1937.  
  1938. Here is what I did in my implementation:
  1939.  
  1940. I assumed that the ball could only be hit on the side and effectively
  1941. on the bottom.  I stored the rolling/english as the x, y portion
  1942. of my vector w, and defined the x movement to be the rotation direction
  1943. which moves the ball in the x direction; same for y.  
  1944.  
  1945. If the ball spins with rate w and the ball is moving at velocity v,
  1946. then the ball is touching (hitting) the ground and there is an
  1947. apparent velocity between the ground and the ball of a = w - v.
  1948. (If there is no slipping and the ball rolls along, a = 0)
  1949.  
  1950. Because there is some (a lot) of slipping, for one time step, I
  1951. define f, the friction of the ball and the ground.  That means
  1952. that I add f * a to w and subtract it from v.  This makes them match.
  1953. I actually should be using a ratio of the mass of the object to
  1954. its moment, but I've just set it to 1 for now.  
  1955.  
  1956. Summary for rolling:
  1957.         a = w - v;
  1958.         w += MtoM * f * a;
  1959.         v -= f * a;
  1960. This accomplishes converting translation into rolling and
  1961. vice versa.  It does it via slipping and catching according to f.
  1962.  
  1963. This had an interesting effect on the simulation.  I had to
  1964. define how elastic collisions worked for a ball striking a surface.
  1965. I ruled that the spin reverses along the normal, just like translational
  1966. motion.  It can be anywhere from inelastic to elastic just like
  1967. translational collisions.  I have this image in my head of a rolling
  1968. gear catching against the side of something and bouncing back, but
  1969. otherwise, don't know if this bouncing is physically valid.  Comments?
  1970.  
  1971. The rolling's effect was to dampen instantaneous translational motion.
  1972. If the ball hit an active bumper, it went quickly away but slowed down as
  1973. the ball slipped and both rolled faster and moved slower.  If I 
  1974. turned off translational elastisity, then when the ball hit something
  1975. it would thud to a stop, but be spinning away and as it 'caught' the
  1976. floor it would start to take off, like a race car.  It looked good.
  1977.  
  1978. Rolling had the effect of, with gravity, losing energy in the system.
  1979. This was at least in my implementation.   I had an explanation in
  1980. my head why this would happen but I can't explain it at the moment.
  1981.  
  1982. I did a similar slipping for spin of the ball (the z portion of w)
  1983. and am still playing with the ball spinning along object, which from
  1984. the top view and gravity on is what you might call rolling.  
  1985.  
  1986. I didn't do anything with the interaction of the 3 directions of
  1987. rotation.  I think they are independent but I don't have a physical
  1988. arguement yet.  I keep thinking that a spinning ball pushed ahead
  1989. would start to veer in the direction of the spin.   I'm also remembering
  1990. that a spin in one direction could resist spins in other directions?
  1991. I'm playing with this but I'd appreciate anyone out there who has an 
  1992. opinion of the actual physics involved.
  1993. I haven't had a chance yet to put a whirlwind type rotater in
  1994. and see if the ball wobbles, as Juri mentioned.  My guess is that
  1995. it won't (yet?) because I'm missing something with the physics.
  1996.  
  1997. If anyone else is interested, I'd like to start an email discussion of
  1998. the physics.  There are enough mistakes that can be made so multiple
  1999. participants would be helpful.
  2000.  
  2001. Best,
  2002. James
  2003.  
  2004.  
  2005. +++++++++++++++++++++++++++
  2006.  
  2007. >From jregier@qualcomm.com (Jason Regier)
  2008. Date: Thu, 18 Jan 1996 10:13:57 -0800
  2009. Organization: Qualcomm, Inc.
  2010.  
  2011. In article <4dk4sc$1a8@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  2012. > It still seems to me that quaternions would provide the ideal simple
  2013. > solution for handling all kinds of spin: with any kind of motion
  2014. > you'll have just a surface normal for the surface that you are
  2015. > hitting or touching, a motion vector and a quaternion. The tough
  2016. > part is then handling the situation where the ball bounces up from
  2017. > the 2D plane.
  2018. THAT would be really interesting to see.  I've never seen a pinball
  2019. simulator where you can actually hit the ball so hard that it smacks off
  2020. the glass (as in real pinball games).  Of course, in order to make your
  2021. pinball hop, you'd need to keep track of the heights of the bumpers and
  2022. other objects.  Well, at least you need to know the height at which it
  2023. will contact the ball (i.e. if bumpers contact below the ball's center of
  2024. mass, then you can hop the ball off the surface of the table!)
  2025.  
  2026. > As long as you have a limited amount of balls (say under 10),
  2027. This is a parameter related to the pinball game, and not the programmer,
  2028. right? ;)
  2029.  
  2030. Jason
  2031.  
  2032. -- 
  2033. Jason Regier
  2034. GlobalStar Software Engineer
  2035. QUALCOMM, Inc.
  2036. (619) 658-4752
  2037. jregier@qualcomm.com
  2038.  
  2039. +++++++++++++++++++++++++++
  2040.  
  2041. >From sg94f7nc@dunx1.ocs.drexel.edu (Geoffrey Kinnel)
  2042. Date: 18 Jan 1996 19:10:24 GMT
  2043. Organization: Drexel University
  2044.  
  2045. This discussion of spin in pinball is interesting, but don't forget that
  2046. pinball tables are covered with mylar, and there is not a whole lot of
  2047. friction as the ball slides around the table. Compare this to a pool
  2048. table, where the surface is felt and you can use the spin. For more
  2049. pinball related stuff, check out rec.games.pinball and the Pinball Archive
  2050. http://pinball.cc.cmu.edu. 
  2051.  
  2052. As an aside, many of the wierd effect people attribute to "playfield
  2053. magnets" are actually due to spin on the ball. I realize this sounds like
  2054. it is in contradiction with the low friction playfield; I don't pretend to
  2055. understand it.
  2056.  
  2057. I hope this helps someone, at least a little.
  2058.  
  2059. Geoff
  2060.  
  2061.  
  2062.  
  2063. +++++++++++++++++++++++++++
  2064.  
  2065. >From jregier@qualcomm.com (Jason Regier)
  2066. Date: Thu, 18 Jan 1996 11:38:15 -0800
  2067. Organization: Qualcomm, Inc.
  2068.  
  2069. In article <jinjur-1701962018470001@165.227.52.132>, jinjur@kudonet.com
  2070. (john calhoun) wrote:
  2071.  
  2072. > In article <DL8Crv.37r@olsen.ch>, james@olsen.ch (James Shaw) wrote:
  2073. > > This had an interesting effect on the simulation.  I had to
  2074. > > define how elastic collisions worked for a ball striking a surface.
  2075. > > I ruled that the spin reverses along the normal, just like translational
  2076. > > motion.  It can be anywhere from inelastic to elastic just like
  2077. > > translational collisions.  I have this image in my head of a rolling
  2078. > > gear catching against the side of something and bouncing back, but
  2079. > > otherwise, don't know if this bouncing is physically valid.  Comments?
  2080. Doesn't sound right to me either.  In an elastic collision, you can't have
  2081. nonconservative forces (i.e. friction).  If there are no frictional forces
  2082. (really frictional torques), then when the spinning ball collides with the
  2083. wall, the ball's angular momentum can't affect the wall.  Therefore,
  2084. angular momentum is conserved because no external torques (or angular
  2085. impulses) act on your system.
  2086.  
  2087. However, in the real world, we do have friction.  When the ball contacts
  2088. the surface, a frictional force will be exerted on the ball.  Thus, energy
  2089. won't be conserved.  The ball's spin will change because of the frictional
  2090. force, yet the  immovable wall won't move because an external impulse acts
  2091. to keep the wall in place after the collision.
  2092.  
  2093. Since you have an external impulse acting on your system, angular momentum
  2094. is not conserved in your collision and the ball's spin will change.  The
  2095. extent of change in this collision will depend on the frictional forces
  2096. exerted during the collision and the loss in energy as a result of the
  2097. collision.
  2098.  
  2099. And remember for the linear momentum part, when a ball hits a motionless
  2100. wall, you exert a force (really an impulse) to keep the wall in place
  2101. during the collision.  So since you're applying an external impulse,
  2102. linear momentum is not conserved and that's why your ball bounces back. 
  2103. But if the collision is elastic, no friction acts on the ball, so energy
  2104. is conserved.
  2105.  
  2106. > > Rolling had the effect of, with gravity, losing energy in the system.
  2107. > > This was at least in my implementation.
  2108. Well, that's wrong.  Gravity is a conservative force, so energy is
  2109. conserved.  If you're losing energy, then that's most likely due to
  2110. roundoff error or other inaccuracies in your implementation.  If friction
  2111. acts on your ball, as it does on everyday balls when they roll, then your
  2112. ball will lose energy as it rolls.  If there's no friction, then your ball
  2113. is simply spinning and translating on a surface, and it won't lose its
  2114. energy.  You better take a closer look at the simple case of a ball just
  2115. bouncing off a surface under the influence of gravity and see whether your
  2116. system works right or not.
  2117.  
  2118. <whew> I think that's right.
  2119.  
  2120. Jason
  2121.  
  2122. -- 
  2123. Jason Regier
  2124. GlobalStar Software Engineer
  2125. QUALCOMM, Inc.
  2126. (619) 658-4752
  2127. jregier@qualcomm.com
  2128.  
  2129. +++++++++++++++++++++++++++
  2130.  
  2131. >From johnb@hk.super.net (John W. Blackburne)
  2132. Date: Sun, 21 Jan 1996 17:15:33 +0800
  2133. Organization: Tempest
  2134.  
  2135. In article <jregier-1801961138150001@jregier-mac.qualcomm.com>,
  2136. jregier@qualcomm.com (Jason Regier) wrote:
  2137.  
  2138. :In article <jinjur-1701962018470001@165.227.52.132>, jinjur@kudonet.com
  2139. :(john calhoun) wrote:
  2140. :
  2141. :> In article <DL8Crv.37r@olsen.ch>, james@olsen.ch (James Shaw) wrote:
  2142. :> 
  2143. :> > This had an interesting effect on the simulation.  I had to
  2144. :> > define how elastic collisions worked for a ball striking a surface.
  2145. :> > I ruled that the spin reverses along the normal, just like translational
  2146. :> > motion.  It can be anywhere from inelastic to elastic just like
  2147. :> > translational collisions.  I have this image in my head of a rolling
  2148. :> > gear catching against the side of something and bouncing back, but
  2149. :> > otherwise, don't know if this bouncing is physically valid.  Comments?
  2150. :> 
  2151. :Doesn't sound right to me either.  In an elastic collision, you can't have
  2152. :nonconservative forces (i.e. friction).  If there are no frictional forces
  2153. :(really frictional torques), then when the spinning ball collides with the
  2154. :wall, the ball's angular momentum can't affect the wall.  Therefore,
  2155. :angular momentum is conserved because no external torques (or angular
  2156. :impulses) act on your system.
  2157.  
  2158. I'm not sure I agree with this. I can certainly imagine a ball hitting an
  2159. elastic surface at an angle/rotating, so it's surface is initially moving
  2160. relative to the elastic surface, and still have it conserving energy, as
  2161. long as it doesn't slide along the surface.
  2162.  
  2163. Only dynamic friction is non-conservative. Friction between two surfaces
  2164. that do not move relative to each other does not lose energy. Enegy may be
  2165. lost internally in the rubber (or whatever) as it stretches
  2166. perpendicularly and parallel to the surface, and due to other frictional
  2167. forces, but it need not be lost in the friction between the ball and
  2168. surface. In fact the greater the coefficient of friction the less likely
  2169. slipping will be be, so the more likely energy will be conservered.
  2170.  
  2171. John
  2172. -- 
  2173. John Blackburne,                     johnb@tempest.net.hk
  2174. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  2175. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  2176.  
  2177. +++++++++++++++++++++++++++
  2178.  
  2179. >From sg94f7nc@dunx1.ocs.drexel.edu (Geoffrey Kinnel)
  2180. Date: 25 Jan 1996 21:22:06 GMT
  2181. Organization: Drexel University
  2182.  
  2183. Bo Lindbergh (d88-bli@xbyse.nada.kth.se) wrote:
  2184. : In article <4dk4sc$1a8@nntp.hut.fi> jmunkki@beta.hut.fi (Juri Munkki) writes:
  2185. : > 
  2186. : > As long as you have a limited amount of balls (say under 10), most
  2187. : > machines should be able to handle any kind of math you want to throw
  2188. : > at them.
  2189.  
  2190. : Hmm, what's the greatest number of balls simultaneously in play ever used
  2191. : in a physical pinball machine?  And if I ask this in rec.games.pinball,
  2192. : will they laugh at me? :-)
  2193.  
  2194.  
  2195. : /Bo Lindbergh
  2196.  
  2197. As I recall, I heard tell of a machine with a 13-ball multiball! This
  2198. sounds suspect to me, but the folks on rec.games.pinball would be happy to
  2199. verify or repudiate my claim.  Many machines support three ball multiball
  2200. and some support up to six. More than that would get unwieldy, clogging up
  2201. the flippers, in my opinion. 
  2202.  
  2203. Geoff
  2204.  
  2205.  
  2206. ---------------------------
  2207.  
  2208. >From drysdall@waikato.ac.nz (Richard Drysdall)
  2209. Subject: Q: When to call ReleaseResource?
  2210. Date: Mon, 22 Jan 1996 16:45:53 +1300
  2211. Organization: University of Waikato
  2212.  
  2213. Hi.
  2214.  
  2215. This may be a silly question, but TR isn't too clear on when to use
  2216. ReleaseResource. Suppose I have a function which has a loop in it like
  2217. this:
  2218.  
  2219.  
  2220. void whatever ()
  2221.  
  2222. {
  2223.    Handle  resourceHandle;
  2224.  
  2225.    do {
  2226.       /* UseResFile and some other stuff */
  2227.       resourceHandle = Get1Resource ('blah', 128);
  2228.       /* look at the resource */
  2229.       /* now finished with that resource */
  2230.       }
  2231.    while (some condition);
  2232.  
  2233. } /* end of function */
  2234.  
  2235.  
  2236. My question is, should I call ReleaseResource every time I loop? Once at
  2237. the end of the function? Or not at all? Is it ok to call ReleaseResource
  2238. on a handle, and then 're-create' the resource handle with another call to
  2239. GetResource?
  2240.  
  2241. Thanks very much for any help.
  2242. -- 
  2243. Richard Drysdall, University of Waikato, New Zealand.
  2244. "I'm called a theoretical physicist because in practice I'm not."
  2245.  
  2246. Information gathering organisations are hereby denied permission to 
  2247. use any personal information pertaining to myself (including my email 
  2248. address) in any commercial transaction.
  2249.  
  2250. +++++++++++++++++++++++++++
  2251.  
  2252. >From Andrew Welch <andrew@AmbrosiaSW.com>
  2253. Date: Mon, 22 Jan 1996 00:06:28 -0500
  2254. Organization: Ambrosia Software, Inc.
  2255.  
  2256. Richard Drysdall wrote:
  2257. > =
  2258.  
  2259. > My question is, should I call ReleaseResource every time I loop? Once at
  2260. > the end of the function? Or not at all? Is it ok to call ReleaseResource
  2261. > on a handle, and then 're-create' the resource handle with another call t=
  2262. o
  2263. > GetResource?
  2264.  
  2265. This response is rather lengthy, but hopefully it will be helpful to =
  2266.  
  2267. you and others.  It's from my little project "Mac Programming =
  2268.  
  2269. Pitfalls".
  2270.  
  2271. =2E....
  2272.  
  2273. #3 -- Properly handling resources.  Author - Andrew Welch
  2274.  
  2275. When you load in a resource -- either directly by calling =
  2276.  
  2277. GetResource(), or indirectly by calling a Toolbox routine like =
  2278.  
  2279. GetPicture(), which in turn calls GetResource() -- the Resource =
  2280.  
  2281. Manager "owns" that Handle.  Do not dispose of it yourself by =
  2282.  
  2283. calling DisposeHandle().
  2284.  
  2285. The Resource Manager keeps a table of all of the resources that it =
  2286.  
  2287. loaded into memory.  If you call GetResource() on a resource Handle =
  2288.  
  2289. that is already in memory, the Resource Manager simply returns the =
  2290.  
  2291. Handle to you.  When you call CloseResFile(), all of the resource =
  2292.  
  2293. Handle=B9s "owned" by that resource file are automatically disposed =
  2294.  
  2295. for you.
  2296.  
  2297. Therefor, do *not* call DisposeHandle() on any Handle that was =
  2298.  
  2299. loaded in by the Resource Manager.  Doing so wil result in the =
  2300.  
  2301. Resource Manager referencing a handle that has already been disposed =
  2302.  
  2303. of.  Can you say "mysterious random crashes"?
  2304.  
  2305. Now let's look at how to properly handle resources in memory.  We'll =
  2306.  
  2307. look at some example code first, and then an explanation:
  2308.  
  2309. Handle myResource;
  2310.  
  2311. myResource =3D GetResource(MY_RESOURCE_TYPE, MY_RESOURCE_ID);
  2312. if (myResource !=3D nil)
  2313.     {
  2314.     HNoPurge(myResource);
  2315.  
  2316. // -- Manipulate the resource as you please...
  2317.  
  2318.     HPurge(myResource);
  2319.     }
  2320.  
  2321. The first thing you'll notice is that we don't call ResError() to =
  2322.  
  2323. see if the resource was loaded in successfully -- the proper way to =
  2324.  
  2325. check to see if a resource was loaded in OK is to check for nil.
  2326.  
  2327. Next you'll notice that the first thing we do if the resource could =
  2328.  
  2329. be loaded in OK is we make the resource unpurgable.  Any Handle that =
  2330.  
  2331. is purgable may disappear out from underneath us if memory is needed =
  2332.  
  2333. elsewhere, and we shouldn't assume that that the resource will be =
  2334.  
  2335. unpurgable when it is loaded in.
  2336.  
  2337. Finally, instead of disposing of the memory that the resource Handle =
  2338.  
  2339. occupies, we simply mark it as purgable.  As we already outlined =
  2340.  
  2341. earlier, you should not call DisposeHandle() on any resource Handle.  =
  2342.  
  2343. If you will never look at the resource again, you can call =
  2344.  
  2345. ReleaseResource() to have the Resource Manager dispose of the =
  2346.  
  2347. resource Handle in memory, and remove it from the Resource Manager's =
  2348.  
  2349. internal data structures.
  2350.  
  2351. However a better way to handle it is to simply set the resource =
  2352.  
  2353. Handle to purgable as was done in the above example.  What this does =
  2354.  
  2355. is it keeps the resource Handle in memory, but if the Memory Manager =
  2356.  
  2357. needs more memory for some other operation, it'll automatically =
  2358.  
  2359. purge it.
  2360.  
  2361. By using this technique, your application will be fast because if =
  2362.  
  2363. memory is available, resources that you use will be kept in memory.  =
  2364.  
  2365. Calls to GetResource() on handles that are already in memory will =
  2366.  
  2367. simply return the resource Handle, rather than go to the disk to =
  2368.  
  2369. load the data in.  If for some reason one of your resource Handles =
  2370.  
  2371. was purged, subsequent calls to GetResource() will simply load it =
  2372.  
  2373. back into memory.
  2374.  
  2375. If you use this technique throughout your code, you won't have to =
  2376.  
  2377. worry about which Handles to call ReleaseResource() on, which to =
  2378.  
  2379. keep around, etc.  It's one simple, effective, optimal technique for =
  2380.  
  2381. handling resources throughout your application.  Let the Memory =
  2382.  
  2383. Manager and Resource Manager work for you.
  2384.  
  2385. +--------------------------------------------------------------+
  2386. |    Andrew Welch - Thaumaturgist - Ambrosia Software, Inc.    |
  2387. +-------------------------------+------------------------------+
  2388. |    AOL-> Keyword: Ambrosia    |  eWorld-> Shortcut: Ambrosia |
  2389. |    CIS-> GO word: Ambrosia    |  http://www.AmbrosiaSW.com/  |
  2390. +-------------------------------+------------------------------+
  2391.  
  2392. +++++++++++++++++++++++++++
  2393.  
  2394. >From DaveZ@mailbag.com (David B. Zwiefelhofer)
  2395. Date: Tue, 23 Jan 1996 09:04:03 -0500
  2396. Organization: Utility Reduction Specialists, Inc.
  2397.  
  2398. In article <drysdall-2201961645530001@ciscoara1-10.slip.waikato.ac.nz>,
  2399. drysdall@waikato.ac.nz wrote:
  2400.  
  2401. > Hi.
  2402. > This may be a silly question, but TR isn't too clear on when to use
  2403. > ReleaseResource. Suppose I have a function which has a loop in it like
  2404. > this:
  2405. > void whatever ()
  2406. > {
  2407. >    Handle  resourceHandle;
  2408. >    do {
  2409. >       /* UseResFile and some other stuff */
  2410. >       resourceHandle = Get1Resource ('blah', 128);
  2411. >       /* look at the resource */
  2412. >       /* now finished with that resource */
  2413. >       }
  2414. >    while (some condition);
  2415. > } /* end of function */
  2416. > My question is, should I call ReleaseResource every time I loop? Once at
  2417. > the end of the function? Or not at all? Is it ok to call ReleaseResource
  2418. > on a handle, and then 're-create' the resource handle with another call to
  2419. > GetResource?
  2420.  
  2421. Why call Get1Resource in the loop if you're going to need that resource
  2422. every time through the loop? Call it once before the loop and
  2423. ReleaseResource after the loop.
  2424.  
  2425. You could call ReleaseResource after the loop and leave the call to
  2426. Get1Resource in the loop. If the resource is in memory already
  2427. Get1Resource will give you a handle to it. It won't reload another copy.
  2428. So it would load it the first time through the loop and then just keep
  2429. giving you a handle to it during the subsequent calls.
  2430.  
  2431. Good luck,
  2432.  
  2433. Dave
  2434.  
  2435. -- 
  2436. David B. Zwiefelhofer
  2437. Utility Reduction Specialists, Inc.
  2438. 1605 Monroe Street, Suite 110
  2439. Madison, WI  53211-2052
  2440. (608) 258-8965
  2441. (608) 258-9686 FAX
  2442.  
  2443. +++++++++++++++++++++++++++
  2444.  
  2445. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  2446. Date: Mon, 22 Jan 1996 16:45:53 -0500
  2447. Organization: Carnegie Mellon, Pittsburgh, PA
  2448.  
  2449. stk@berlin.snafu.de (Stefan Kurth) writes:
  2450. > Andrew Welch <andrew@AmbrosiaSW.com> wrote:
  2451. > > If for some reason one of your resource Handles was purged, subsequent
  2452. > > calls to GetResource() will simply load it back into memory.
  2453. > Will they?  I thought that GetResource would return the empty handle in
  2454. > this case, and you would have to call LoadResource explicitly.  No?
  2455.  
  2456. >From NIM:
  2457.  
  2458. "If the entry contains a a handle whose value is NIL, and if you
  2459. haven't called SetResLoad with the load parameter set to FALSE,
  2460. GetResource attempts to read the resource into memory."
  2461.  
  2462. --Z
  2463.  
  2464. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  2465.  
  2466. +++++++++++++++++++++++++++
  2467.  
  2468. >From stk@berlin.snafu.de (Stefan Kurth)
  2469. Date: Mon, 22 Jan 1996 20:45:03 +0100
  2470. Organization: none
  2471.  
  2472. Andrew Welch <andrew@AmbrosiaSW.com> wrote:
  2473.  
  2474. > If for some reason one of your resource Handles was purged, subsequent
  2475. > calls to GetResource() will simply load it back into memory.
  2476.  
  2477. Will they?  I thought that GetResource would return the empty handle in
  2478. this case, and you would have to call LoadResource explicitly.  No?
  2479.  
  2480.  
  2481. -- 
  2482. Stefan Kurth
  2483. Berlin, Germany
  2484.  
  2485. ---------------------------
  2486.  
  2487. >From Robert Altman <rl3gppc@tribeca.ios.com>
  2488. Subject: Quickdraw 3D intro??
  2489. Date: 23 Jan 1996 20:25:13 GMT
  2490. Organization: Internet Online Services
  2491.  
  2492. I am an intermediate C programmer, and I would like to write some apps 
  2493. that use basic Quickdraw 3D (i.e. I would use the standrd viewer). Are 
  2494. there any good intros to Quickdraw 3D (in bookstores or on the Net)? I 
  2495. have a book that Apple publishes, but it is difficult to digest as it is 
  2496. more of a formal definition than a tutorial. 
  2497.  
  2498. Thanks!!!
  2499.  
  2500. --Robert
  2501.  
  2502.  
  2503.  
  2504. +++++++++++++++++++++++++++
  2505.  
  2506. >From jaks@netcom.com (Eric Jackson)
  2507. Date: Wed, 24 Jan 1996 20:52:24 GMT
  2508. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2509.  
  2510. In article <4e3g79$s9p@news.ios.com>,
  2511. Robert Altman  <rl3gppc@tribeca.ios.com> wrote:
  2512. >I am an intermediate C programmer, and I would like to write some apps 
  2513. >that use basic Quickdraw 3D (i.e. I would use the standrd viewer). Are 
  2514. >there any good intros to Quickdraw 3D (in bookstores or on the Net)? I 
  2515. >have a book that Apple publishes, but it is difficult to digest as it is 
  2516. >more of a formal definition than a tutorial. 
  2517. >
  2518. >Thanks!!!
  2519.  
  2520. Here is a good place to start.
  2521.  
  2522. http://product.info.apple.com/qd3d/QD3D.HTML
  2523.  
  2524. Now I would suggest that you take a look at the develop articles
  2525. they are pretty good.  I think that you might be able to find them at
  2526. the URL that I suggested.
  2527.  
  2528. Eric
  2529.  
  2530.  
  2531. ---------------------------
  2532.  
  2533. >From Darren King <breakpt@interlog.com>
  2534. Subject: Starting MacTCP on startup
  2535. Date: Mon, 15 Jan 1996 20:02:29 -0500
  2536. Organization: BreakPoint Design
  2537.  
  2538. When I start my program, I check for MacTCP.  If it isn't running,
  2539. the call returns 0 (correctly).  Most programs start MacTCP if
  2540. it isn't running (netscape, etc...).  How do you tell if MacTCP
  2541. isn't installed on the system or if just isn't running right
  2542. now?  This behaviour is common on home machines that have to dial
  2543. up the internet so MacTCP isn't running all the time.
  2544.  
  2545. thanx
  2546.  
  2547. Darren King, BreakPoint Design
  2548.  
  2549. +++++++++++++++++++++++++++
  2550.  
  2551. >From colen@teleport.com (Colen Garoutte-Carson)
  2552. Date: Tue, 16 Jan 1996 13:27:56 +0100
  2553. Organization: Teleport - Portland's Public Access (503) 220-1016
  2554.  
  2555. In article <30FAF925.71FA@interlog.com>, breakpt@interlog.com wrote:
  2556.  
  2557. > When I start my program, I check for MacTCP.  If it isn't running,
  2558. > the call returns 0 (correctly).  Most programs start MacTCP if
  2559. > it isn't running (netscape, etc...).  How do you tell if MacTCP
  2560. > isn't installed on the system or if just isn't running right
  2561. > now?  This behaviour is common on home machines that have to dial
  2562. > up the internet so MacTCP isn't running all the time.
  2563.  
  2564. Darren,
  2565.  
  2566.      There is a Gestalt to check for the existance of MacTCP.  However,
  2567. the Gestalt will fail under AU/X.  I've include pascal code below for a
  2568. hack that I use (to check for the control panel).  This probably won't
  2569. work pre-Sys7.
  2570.  
  2571.  - Colen Garoutte-Carson
  2572.  
  2573.  
  2574. function HasMacTCP: boolean;
  2575.    var
  2576.       hasit, done: boolean;
  2577.       myPB: CInfoPBRec;
  2578.       fileName: str255;
  2579.       fi: HParamBlockRec;
  2580.       result: longint;
  2581.    begin
  2582.       hasit := Gestalt('mtcp', result) = NoErr;
  2583.       if not hasit then    {Failsafe if Gestalt does not work (Which it
  2584. does not under AU/X)}
  2585.          begin
  2586.             fileName := 'Control Panels';
  2587.             myPB.ioNameptr := @fileName;
  2588.             myPB.ioVRefNum := theWorld.sysVRefNum;
  2589.             myPB.ioFVersNum := 0;
  2590.             myPB.ioDirID := 0;
  2591.             myPB.ioFDirIndex := 0;
  2592.             if PBGetCatInfoSync(@myPB) = noErr then
  2593.                begin
  2594.                   if BitTst(@mypb.ioFlAttrib, 3) then
  2595.                      begin
  2596.                         fi.ioCompletion := nil;
  2597.                         fi.ioNamePtr := @filename;
  2598.                         fi.ioVRefNum := theWorld.sysVRefNum;
  2599.                         fi.ioDirID := myPB.ioDirID;
  2600.                         fi.ioFDirIndex := 1;
  2601.                         done := false;
  2602.                         while not done do
  2603.                            begin
  2604.                               done := PBHGetFInfoSync(@fi) <> noErr;
  2605.                               if not done then
  2606.                                  begin
  2607.                                     if (fi.ioFlFndrInfo.fdType = 'cdev')
  2608. and ((fi.ioFlFndrInfo.fdCreator = 'atcp') or (fi.ioFlFndrInfo.fdCreator =
  2609. 'ztcp')) then
  2610.                                        begin
  2611.                                           hasit := true;
  2612.                                           done := true;
  2613.                                        end;
  2614.                                     fi.ioFDirIndex := fi.ioFDirIndex + 1;
  2615.                                     fi.ioDirID := myPB.ioDirID;
  2616.                                  end;
  2617.                            end;
  2618.                      end;
  2619.                end;
  2620.          end;
  2621.       HasMacTCP := hasit;
  2622.    end;
  2623.  
  2624. +++++++++++++++++++++++++++
  2625.  
  2626. >From Andreas.Magnusson@mailbox.swipnet.se (Andreas Magnusson)
  2627. Date: Wed, 17 Jan 1996 09:10:12 +0100
  2628. Organization: -
  2629.  
  2630. In article <colen-1601961327560001@ip-pdx05-15.teleport.com>,
  2631. colen@teleport.com (Colen Garoutte-Carson) wrote:
  2632.  
  2633. >In article <30FAF925.71FA@interlog.com>, breakpt@interlog.com wrote:
  2634. >
  2635. >> When I start my program, I check for MacTCP.  If it isn't running,
  2636. >> the call returns 0 (correctly).  Most programs start MacTCP if
  2637. >> it isn't running (netscape, etc...).  How do you tell if MacTCP
  2638. >> isn't installed on the system or if just isn't running right
  2639. >> now?  This behaviour is common on home machines that have to dial
  2640. >> up the internet so MacTCP isn't running all the time.
  2641. >
  2642. >Darren,
  2643. >
  2644. >     There is a Gestalt to check for the existance of MacTCP.  However,
  2645. >the Gestalt will fail under AU/X.  I've include pascal code below for a
  2646. >hack that I use (to check for the control panel).  This probably won't
  2647. >work pre-Sys7.
  2648. >
  2649. > - Colen Garoutte-Carson
  2650. >
  2651. >            fileName := 'Control Panels';
  2652.  
  2653. And I doubt it would work on an non-US machine? Or does AU/X require an
  2654. US-system so that you know for sure that the folder is called Control
  2655. Panels?
  2656.  
  2657. Is there some AU/X reason also that you don't use FindFolder instead?
  2658.  
  2659. /Andreas
  2660.  
  2661. -- 
  2662. Andreas Magnusson         |   ...but Hilta laughed like someone who had
  2663. m-26334@mailbox.swipnet.se|  thought hard about life and had seen the joke.
  2664. x95andma@ida.liu.se       |
  2665. zune@lysator.liu.se       |                               - Terry Pratchett                     
  2666.  
  2667. +++++++++++++++++++++++++++
  2668.  
  2669. >From stk@berlin.snafu.de (Stefan Kurth)
  2670. Date: Thu, 18 Jan 1996 15:25:58 +0100
  2671. Organization: none
  2672.  
  2673. Colen Garoutte-Carson <colen@teleport.com> wrote:
  2674.  
  2675. >      Do you know of any safe way, other than Gestalt, to check for the
  2676. > existance of MacTCP?
  2677.  
  2678. Walk the driver unit table and look for the .ipp driver.
  2679.  
  2680.  
  2681. -- 
  2682. Stefan Kurth
  2683. Berlin, Germany
  2684.  
  2685. +++++++++++++++++++++++++++
  2686.  
  2687. >From isis@isis-intl.com (Mike Cohen)
  2688. Date: Fri, 19 Jan 1996 11:44:46 -0600
  2689. Organization: ISIS International
  2690.  
  2691. In article <Andreas.Magnusson-1701960910120001@dialup100-134.swipnet.se>,
  2692. Andreas.Magnusson@mailbox.swipnet.se (Andreas Magnusson) wrote:
  2693.  
  2694. >And I doubt it would work on an non-US machine? Or does AU/X require an
  2695. >US-system so that you know for sure that the folder is called Control
  2696. >Panels?
  2697.  
  2698. I think A/UX was a restricted product that couldn't be shipped outside the
  2699. US.
  2700.  
  2701.  
  2702. --
  2703. Mike Cohen - isis@isis-intl.com
  2704. Home Page: http://www.isis-intl.com/
  2705. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  2706. *** Save Mystery Science Theater 3000! Comedy Central has decided to
  2707. *** cancel it. Call them at (212) 767-8600 and tell them what you think.
  2708. *** Full details at http://fermi.clas.virginia.edu/~jcp9j/canceled.html
  2709.  
  2710. +++++++++++++++++++++++++++
  2711.  
  2712. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  2713. Date: Mon, 22 Jan 1996 13:57:56 +1300
  2714. Organization: Dept. of Information Science, University of Otago
  2715.  
  2716. In article <AD2534AE966883482@cpr-cap-1.wyoming.com>, isis@isis-intl.com
  2717. (Mike Cohen) wrote:
  2718.  
  2719. > I think A/UX was a restricted product that couldn't be shipped outside the
  2720. > US.
  2721.  
  2722. We had people running it here in New Zealand...
  2723.  
  2724. =====================================================================
  2725. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  2726. University of Otago,     Phone: +64 3 479-8179
  2727. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  2728.  
  2729. +++++++++++++++++++++++++++
  2730.  
  2731. >From dnebing@epix.net (Dave Nebinger)
  2732. Date: Fri, 19 Jan 1996 14:14:08 -0500
  2733. Organization: KHP Services, Inc
  2734.  
  2735. In article <19960118152558238156@stk.berlin.snafu.de>, stk@berlin.snafu.de
  2736. (Stefan Kurth) wrote:
  2737.  
  2738. > Colen Garoutte-Carson <colen@teleport.com> wrote:
  2739. > >      Do you know of any safe way, other than Gestalt, to check for the
  2740. > > existance of MacTCP?
  2741. > Walk the driver unit table and look for the .ipp driver.
  2742.  
  2743. Again, this will only determine if MacTCP has been opened already.
  2744.  
  2745. It does not determine if it is merely installed but not yet opened.
  2746.  
  2747. Dave.
  2748.  
  2749. ==========================================================
  2750. Dave Nebinger                             dnebing@epix.net
  2751.              The Alt.Sources.Mac Archivist
  2752.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  2753.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  2754.  
  2755. +++++++++++++++++++++++++++
  2756.  
  2757. >From colen@teleport.com (Colen Garoutte-Carson)
  2758. Date: Wed, 17 Jan 1996 15:34:06 +0100
  2759. Organization: Teleport - Portland's Public Access (503) 220-1016
  2760.  
  2761. In article <Andreas.Magnusson-1701960910120001@dialup100-134.swipnet.se>,
  2762. Andreas.Magnusson@mailbox.swipnet.se (Andreas Magnusson) wrote:
  2763.  
  2764. > >            fileName := 'Control Panels';
  2765. > And I doubt it would work on an non-US machine? Or does AU/X require an
  2766. > US-system so that you know for sure that the folder is called Control
  2767. > Panels?
  2768. > Is there some AU/X reason also that you don't use FindFolder instead?
  2769.  
  2770. Andreas,
  2771.  
  2772.      Well, I never made any claims as to the quality of the code.  :) 
  2773. It's been a while since I threw that together.
  2774.  
  2775.      If you want to be technical, all of that failsafe code should be
  2776. avoided.  Just because the MacTCP control panel is in the Control Panels
  2777. folder doesn't mean it was there when you last booted the machine.
  2778.  
  2779.      Do you know of any safe way, other than Gestalt, to check for the
  2780. existance of MacTCP?  Since I do not have A/UX, myself, and fixed this
  2781. problem for someone from remote, I'm not entirely sure that the Gestalt
  2782. does not work.
  2783.  
  2784.      Can anyone confirm this for me?
  2785.  
  2786.  - Colen
  2787.  
  2788. +++++++++++++++++++++++++++
  2789.  
  2790. >From pope@edunet.dk (Povl H. Pedersen)
  2791. Date: 18 Jan 1996 11:23:54 GMT
  2792. Organization: edu!
  2793.  
  2794. In article <colen-1601961327560001@ip-pdx05-15.teleport.com>,
  2795. colen@teleport.com (Colen Garoutte-Carson) wrote:
  2796.  
  2797. :            fileName := 'Control Panels';
  2798.  
  2799. nnonononononono NO !!!!!!
  2800.  
  2801. ALWAYS use FindFolder to find the special folders (Systemmappe, and those
  2802. inside like Kontrolpaneler, Udvidelser, Indstillinger, Skrifter).
  2803. Don't ever assume anything about naming of these folders. Or if you do,
  2804. then you should also do a:
  2805.  
  2806. typedef char struct {
  2807.    unused: 1; // we are in the US, so we only do 7-bit ASCII
  2808.    data: 7;
  2809. }
  2810.  
  2811. NeverEver assume anything about such things. Color is misspelled even in the UK.
  2812.  
  2813. -- 
  2814. Povl H. Pedersen - pope@edunet.dk
  2815. Macintosh / Unix / Win (aaargghh) programmer -  System Administrator
  2816. Microsoft philosophy since 1984: Why innovate when you can immitate
  2817.  
  2818. +++++++++++++++++++++++++++
  2819.  
  2820. >From dnebing@epix.net (Dave Nebinger)
  2821. Date: Thu, 18 Jan 1996 09:46:40 -0500
  2822. Organization: KHP Services, Inc
  2823.  
  2824. In article <colen-1601961327560001@ip-pdx05-15.teleport.com>,
  2825. colen@teleport.com (Colen Garoutte-Carson) wrote:
  2826.  
  2827. > In article <30FAF925.71FA@interlog.com>, breakpt@interlog.com wrote:
  2828. > > When I start my program, I check for MacTCP.  If it isn't running,
  2829. > > the call returns 0 (correctly).  Most programs start MacTCP if
  2830. > > it isn't running (netscape, etc...).  How do you tell if MacTCP
  2831. > > isn't installed on the system or if just isn't running right
  2832. > > now?  This behaviour is common on home machines that have to dial
  2833. > > up the internet so MacTCP isn't running all the time.
  2834. >      There is a Gestalt to check for the existance of MacTCP.  However,
  2835. > the Gestalt will fail under AU/X.  I've include pascal code below for a
  2836. > hack that I use (to check for the control panel).  This probably won't
  2837. > work pre-Sys7.
  2838.  
  2839. Note that checking for the control panel does not mean that MacTCP is
  2840. installed:
  2841.  
  2842.   1.  Inits and cdevs might have been disabled at startup.
  2843.   2.  The software might just have been installed without restarting the Mac.
  2844.  
  2845. Dave.
  2846.  
  2847. ==========================================================
  2848. Dave Nebinger                             dnebing@epix.net
  2849.              The Alt.Sources.Mac Archivist
  2850.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  2851.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  2852.  
  2853. +++++++++++++++++++++++++++
  2854.  
  2855. >From stk@berlin.snafu.de (Stefan Kurth)
  2856. Date: Tue, 23 Jan 1996 02:13:31 +0100
  2857. Organization: none
  2858.  
  2859. Dave Nebinger <dnebing@epix.net> wrote:
  2860.  
  2861. > stk@berlin.snafu.de (Stefan Kurth) wrote:
  2862. > > Walk the driver unit table and look for the .ipp driver.
  2863. > Again, this will only determine if MacTCP has been opened already.
  2864. > It does not determine if it is merely installed but not yet opened.
  2865.  
  2866. Yes it does.
  2867.  
  2868.  
  2869. The MacTCP driver is installed at startup, so its existence or abscence
  2870. in the driver table _does_ tell you if MacTCP is installed or not.  To
  2871. find out if it has been opened already, you have to check the dOpened
  2872. bit of the driver's dCtlFlags.
  2873.  
  2874.  
  2875. -- 
  2876. Stefan Kurth
  2877. Berlin, Germany
  2878.  
  2879. ---------------------------
  2880.  
  2881. >From cmsngr@aol.com (CMSngr)
  2882. Subject: VBL Afterlife
  2883. Date: 7 Jan 1996 20:29:13 -0500
  2884. Organization: America Online, Inc. (1-800-827-6364)
  2885.  
  2886.  
  2887. Hi!
  2888.  
  2889.      I was wondering what happens to VBL tasks registered from an 
  2890. application when that application unexpectedly dies. I am seeing some 
  2891. strangeness in the CW debugger on runs after the first one. Any 
  2892. comments?
  2893.  
  2894. Thanks!
  2895. -Chris
  2896.  
  2897. +++++++++++++++++++++++++++
  2898.  
  2899. >From bwade@qualia.com (Bretton Wade)
  2900. Date: Sun, 07 Jan 1996 23:27:22 -0500
  2901. Organization: qualia, inc.
  2902.  
  2903. In article <4cps19$aql@newsbf02.news.aol.com>, cmsngr@aol.com (CMSngr) wrote:
  2904.  
  2905. #      I was wondering what happens to VBL tasks registered from an 
  2906. # application when that application unexpectedly dies. I am seeing some 
  2907. # strangeness in the CW debugger on runs after the first one. Any 
  2908. # comments?
  2909.  
  2910. Yeah, the VBL sticks around and keeps trying to call the function you gave
  2911. it. Patch ExitToShell to remove the task, or reboot after every crash...
  2912.  
  2913. -- 
  2914. bwade@qualia.com
  2915. http://www.qualia.com/
  2916.  
  2917. +++++++++++++++++++++++++++
  2918.  
  2919. >From dwareing@adelaide.on.net (David Wareing)
  2920. Date: Mon, 08 Jan 1996 15:43:59 +0930
  2921. Organization: Weyland Yutani
  2922.  
  2923. In article <4cps19$aql@newsbf02.news.aol.com>, cmsngr@aol.com (CMSngr) wrote:
  2924.  
  2925. >Hi!
  2926. >
  2927. >     I was wondering what happens to VBL tasks registered from an 
  2928. >application when that application unexpectedly dies. I am seeing some 
  2929. >strangeness in the CW debugger on runs after the first one. Any 
  2930. >comments?
  2931.  
  2932. What happens is death. Say goodbye to your machine for 3 minutes
  2933. while you reboot it from the switch.
  2934.  
  2935. This is one of the perils of working with VBL and Time Manager tasks
  2936. during development. If you need to 'es' or just get out of the app
  2937. in a real hurry, then that TM task is probably going to clobber you
  2938. very shortly afterwards. If it doesn't get you immediately, you can
  2939. put money on it to crash you within minutes. So, either do without
  2940. such tasks during development (substitute them with less accurate
  2941. mechanisms), or try to make sure all your debugging code addresses 
  2942. the tasks and cleans them up properly before exiting.
  2943.  
  2944. Then there's still a problem after development too. If a user tries
  2945. to do a hard-quit on your app (which seems to be a very common habit
  2946. among some users) then it's probably going to be crash time for their Mac.
  2947. And of course they'll blame you, despite your protests that hard-quitting
  2948. is a stupid thing to do...
  2949.  
  2950. -- 
  2951. David Wareing                                 dwareing@adelaide.on.net
  2952. Belair, South Australia           http://www.AmbrosiaSW.com/~dwareing/
  2953. Macintosh Games & Multimedia Programming
  2954.  
  2955.  
  2956. +++++++++++++++++++++++++++
  2957.  
  2958. >From jmunkki@beta.hut.fi (Juri Munkki)
  2959. Date: 8 Jan 1996 06:26:34 GMT
  2960. Organization: Helsinki University of Technology
  2961.  
  2962. In article <dwareing-0801961543590001@ppp147.adelaide.on.net.au> dwareing@adelaide.on.net (David Wareing) writes:
  2963. >In article <4cps19$aql@newsbf02.news.aol.com>, cmsngr@aol.com (CMSngr) wrote:
  2964. >>     I was wondering what happens to VBL tasks registered from an 
  2965. >>application when that application unexpectedly dies. I am seeing some 
  2966. >>strangeness in the CW debugger on runs after the first one. Any 
  2967. >>comments?
  2968.  
  2969. >This is one of the perils of working with VBL and Time Manager tasks
  2970. >during development. If you need to 'es' or just get out of the app
  2971. >in a real hurry, then that TM task is probably going to clobber you
  2972. >very shortly afterwards. If it doesn't get you immediately, you can
  2973. >put money on it to crash you within minutes. So, either do without
  2974. >such tasks during development (substitute them with less accurate
  2975. >mechanisms), or try to make sure all your debugging code addresses 
  2976. >the tasks and cleans them up properly before exiting.
  2977.  
  2978. As was already said, patching ExitToShell works well. Arashi does it for
  2979. the sound code, so you can check the source. (It's 68K code only, so
  2980. PowerMac programmers will have to do it slightly differently.)
  2981.  
  2982. It's much easier to debug a program when you know that doing an ExitToShell
  2983. from the debugger is ok.
  2984.  
  2985. What I do now is that I have a manager that keeps a list of procedures
  2986. to call on ExitToShell. It can also remove calls from the list, so if
  2987. the program is terminated normally, the calls are all removed before
  2988. ExitToShell is called. All the classes that need this service use this
  2989. manager instead of patching ExitToShell on their own. (I would post it,
  2990. but I only have a 68K Think C version...)
  2991.  
  2992. -- 
  2993. Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  2994. http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  2995.  
  2996. +++++++++++++++++++++++++++
  2997.  
  2998. >From zzkbergm@dingo.uq.edu.au (Christoph Bergmann)
  2999. Date: Mon, 08 Jan 1996 19:02:47 +1000
  3000. Organization: University of Queensland
  3001.  
  3002. In article <4cqdeq$5ff@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  3003.  
  3004. > In article <dwareing-0801961543590001@ppp147.adelaide.on.net.au>
  3005. dwareing@adelaide.on.net (David Wareing) writes:
  3006. > >In article <4cps19$aql@newsbf02.news.aol.com>, cmsngr@aol.com (CMSngr) wrote:
  3007. > >>     I was wondering what happens to VBL tasks registered from an 
  3008. > >>application when that application unexpectedly dies. I am seeing some 
  3009. > >>strangeness in the CW debugger on runs after the first one. Any 
  3010. > >>comments?
  3011. > >This is one of the perils of working with VBL and Time Manager tasks
  3012. > >during development. If you need to 'es' or just get out of the app
  3013. > >in a real hurry, then that TM task is probably going to clobber you
  3014. > >very shortly afterwards. If it doesn't get you immediately, you can
  3015. > >put money on it to crash you within minutes. So, either do without
  3016. > >such tasks during development (substitute them with less accurate
  3017. > >mechanisms), or try to make sure all your debugging code addresses 
  3018. > >the tasks and cleans them up properly before exiting.
  3019. > As was already said, patching ExitToShell works well. Arashi does it for
  3020. > the sound code, so you can check the source. (It's 68K code only, so
  3021. > PowerMac programmers will have to do it slightly differently.)
  3022. > It's much easier to debug a program when you know that doing an ExitToShell
  3023. > from the debugger is ok.
  3024.  
  3025. this would be one alternative..
  3026. the one i use was simply to (in the timetask..) check the keyboard. if i
  3027. hold down cmd-option-control, the task would kill itself.. saves a lot of
  3028. bother with ES trapping, but u wouldnt want it in a final version..
  3029.  
  3030. ChrisB
  3031.  
  3032. +++++++++++++++++++++++++++
  3033.  
  3034. >From groovy@netaxs.com (Groovy)
  3035. Date: Mon, 08 Jan 1996 16:17:07 -0400
  3036. Organization: Groovy Threads
  3037.  
  3038. In article <4cqdeq$5ff@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  3039.  
  3040.  
  3041. > What I do now is that I have a manager that keeps a list of procedures
  3042. > to call on ExitToShell. It can also remove calls from the list, so if
  3043. > the program is terminated normally, the calls are all removed before
  3044. > ExitToShell is called. All the classes that need this service use this
  3045. > manager instead of patching ExitToShell on their own. (I would post it,
  3046. > but I only have a 68K Think C version...)
  3047. > -- 
  3048. > Juri Munkki jmunkki@iki.fi              Life is easy when polygons are cheap.
  3049. > http://www.iki.fi/~jmunkki                 Windsurfing: Faster than the wind.
  3050.  
  3051. My tasks "themselves" always check to see if my app is present and running
  3052. before doing anything.   This way if I crash or a user hard quits
  3053. my task doesn't care cause it will not do anything but rts.
  3054.  
  3055.  
  3056. I guess you could write the code to maybe even dequeue itself.
  3057.  
  3058.  
  3059. Groovy
  3060.  
  3061. +++++++++++++++++++++++++++
  3062.  
  3063. >From cmsngr@aol.com (CMSngr)
  3064. Date: 10 Jan 1996 20:09:49 -0500
  3065. Organization: America Online, Inc. (1-800-827-6364)
  3066.  
  3067. bwade@qualia.com says:
  3068.  
  3069. "Yeah, the VBL sticks around and keeps trying to call the function you 
  3070. gave it. Patch ExitToShell to remove the task, or reboot after every 
  3071. crash..."
  3072.  
  3073. Hi!
  3074.  
  3075. That was my suspicion. Score one for uninstalling a VBL task after every 
  3076. sync for debug builds. This may have extra overhead but it sure is safer.
  3077.  
  3078. Thanks!
  3079. -Chris
  3080.  
  3081. PS: What a mac day, first I spent an hour with the Inside Mac 
  3082. Files book figuring out how to find all the files in a directory and then 
  3083. this VBL thing. Sometimes the mac is actually worse than embedded 
  3084. printer code. (My day job.) To bad the elegance of the GUI is not
  3085. reflected 
  3086. in the API eh?
  3087.  
  3088. +++++++++++++++++++++++++++
  3089.  
  3090. >From jesjones@halcyon.com (Jesse Jones)
  3091. Date: 11 Jan 1996 03:37:21 GMT
  3092. Organization: Edmark
  3093.  
  3094. In article <groovy-0801961617070001@chestnut1-44.slip.netaxs.com>,
  3095. groovy@netaxs.com (Groovy) wrote:
  3096.  
  3097. > In article <4cqdeq$5ff@nntp.hut.fi>, jmunkki@beta.hut.fi (Juri Munkki) wrote:
  3098. > > 
  3099. > > What I do now is that I have a manager that keeps a list of procedures
  3100. > > to call on ExitToShell. It can also remove calls from the list, so if
  3101. > > the program is terminated normally, the calls are all removed before
  3102. > > ExitToShell is called. All the classes that need this service use this
  3103. > > manager instead of patching ExitToShell on their own. (I would post it,
  3104. > > but I only have a 68K Think C version...)
  3105. > > 
  3106. > > -- 
  3107. > > Juri Munkki jmunkki@iki.fi              Life is easy when polygons are
  3108. cheap.
  3109. > > http://www.iki.fi/~jmunkki                 Windsurfing: Faster than
  3110. the wind.
  3111. > My tasks "themselves" always check to see if my app is present and running
  3112. > before doing anything.   This way if I crash or a user hard quits
  3113. > my task doesn't care cause it will not do anything but rts.
  3114. > I guess you could write the code to maybe even dequeue itself.
  3115. > Groovy
  3116.  
  3117. Note that IM:Processes says that VBL tasks installed in the app's heap are
  3118. removed automatically when the app quits or crashes (page 4-9). On the
  3119. other hand, the OS doesn't appear to do this for Time Manager tasks: until
  3120. I installed an ExitToShell patch I had problems quitting the app
  3121. abnormally when Time Manager tasks were installed.
  3122.  
  3123.   --Jesse
  3124.  
  3125. +++++++++++++++++++++++++++
  3126.  
  3127. >From bwade@qualia.com (Bretton Wade)
  3128. Date: Mon, 15 Jan 1996 22:46:50 -0500
  3129. Organization: qualia, inc.
  3130.  
  3131. In article <jesjones-1001960740360001@blv-pm11-ip14.halcyon.com>,
  3132. jesjones@halcyon.com (Jesse Jones) wrote:
  3133.  
  3134. # Note that IM:Processes says that VBL tasks installed in the app's heap are
  3135. # removed automatically when the app quits or crashes (page 4-9). On the
  3136. # other hand, the OS doesn't appear to do this for Time Manager tasks: until
  3137. # I installed an ExitToShell patch I had problems quitting the app
  3138. # abnormally when Time Manager tasks were installed.
  3139.  
  3140. The normal VBL queue may get cleaned up on exit, but the slot manager
  3141. queues don't seem to be.
  3142.  
  3143. -- 
  3144. bwade@qualia.com
  3145. http://www.qualia.com/
  3146.  
  3147. +++++++++++++++++++++++++++
  3148.  
  3149. >From Valentin Bonnard <bonnardv@pratique.fr>
  3150. Date: 25 Jan 1996 13:08:57 GMT
  3151. Organization: Internet Way
  3152.  
  3153.     
  3154. bwade@qualia.com (Bretton Wade) wrote:
  3155. >In article <jesjones-1001960740360001@blv-pm11-ip14.halcyon.com>,
  3156. >jesjones@halcyon.com (Jesse Jones) wrote:
  3157. >
  3158. ># Note that IM:Processes says that VBL tasks installed in the app's heap are
  3159. ># removed automatically when the app quits or crashes (page 4-9). On the
  3160. ># other hand, the OS doesn't appear to do this for Time Manager tasks: until
  3161. ># I installed an ExitToShell patch I had problems quitting the app
  3162. ># abnormally when Time Manager tasks were installed.
  3163. >
  3164. >The normal VBL queue may get cleaned up on exit, but the slot manager
  3165. >queues don't seem to be.
  3166. >
  3167. >-- 
  3168. >bwade@qualia.com
  3169. >http://www.qualia.com/
  3170.  
  3171. I have just pressed Cmd-Opt-Esc and pressed the OK button in one of my apps who 
  3172. install a normal VBL (not with SlotVInstall), and the mouse stoped moving 
  3173. immediatly... (and I had to do a Cmd-Ctrl-Restart)
  3174.  
  3175. Valentin bonnard
  3176. bonnardv@pratique.fr
  3177.  
  3178.  
  3179. ---------------------------
  3180.  
  3181. >From Todd_Clements@hmc.edu (Todd Clements)
  3182. Subject: Why would dragging in a thumb crash?
  3183. Date: Mon, 22 Jan 1996 21:39:56 -0800
  3184. Organization: Harvey Mudd College
  3185.  
  3186. I'm trying to work out some of the more hideous bugs in my program right
  3187. now, and this one keeps coming up.  I can use the scroll bar just fine in
  3188. a certain window...however, if I try to grab the thumb and use it, it
  3189. crashes with the resultant macsbug log file:
  3190. /* begin log file */
  3191. Unimplemented Instruction at 00060258
  3192.  Calling chain using A6/R1 links
  3193.   Back chain  ISA  Caller
  3194.   010B1CF4    68K  00FC26E8  main+00114
  3195.   010B1CE0    68K  00FC2734  EventLoop+0000E
  3196.   010B1CD0    68K  00FC6AC4  GetEvent+0011C
  3197.   010B1CA2    68K  4087C4AA  _FindDialogItem+003C8
  3198.   010B1BF2    68K  4086ED2C  _TrackControl+00134
  3199.   010B1BAE    68K  4086EB90  _DragControl+00072
  3200.   010B1B78    68K  408768DE  _DragTheRgn+001DA
  3201.  Closing log
  3202. /* end log file */
  3203.  
  3204. It doesn't look like its my program thats doing it directly since I'm
  3205. letting the system software deal with dragging in the thumb, but I'm sure
  3206. I've done it indirectly, somewhere in the depths of memory. Does anyone
  3207. have a hint as to what _type_ of error I've made (I realize without code
  3208. it would be impossible to tell me the actual error)
  3209.  
  3210. Any help is appreciated, as are copies to e-mail.
  3211.  
  3212. Todd
  3213. --
  3214. tclement@hmc.edu  Todd Clements - <http://www.cs.hmc.edu/~tclement>
  3215. "If the federal government were around when the Creator put His hand on this state, Indiana wouldn't be here...it'd still be waiting for an environmental impact statement. - Ronald Reagan
  3216.  
  3217. +++++++++++++++++++++++++++
  3218.  
  3219. >From mike_duigou@fwb.com (Mike Duigou)
  3220. Date: Wed, 24 Jan 1996 16:35:40 -0800
  3221. Organization: FWB Inc.
  3222.  
  3223.  
  3224.  
  3225. The usual problem is that you have an action proc when the user is
  3226. dragging the thumb. The toolbox is flawed in that you can have an action
  3227. proc for the other scroll bar parts, but not the thumb. To track the thumb
  3228. you can't do it with an action proc. You *must* specify -1 for the action
  3229. proc if the part returned from FindControl is kControlIndicatorPart.
  3230. Sample source exists for making the thumb have action when you move it.
  3231. (Sorry, I don't have any).
  3232.  
  3233. Mike Duigou
  3234. FWB Inc.
  3235. -- 
  3236. - -
  3237. "Me, when I have nothing to say, my lips are sealed." -- Talking Heads
  3238.  
  3239. +++++++++++++++++++++++++++
  3240.  
  3241. >From dnebing@epix.net (Dave Nebinger)
  3242. Date: Thu, 25 Jan 1996 12:52:03 -0500
  3243. Organization: KHP Services, Inc
  3244.  
  3245. In article <mike_duigou-2401961635400001@205.172.32.172>,
  3246. mike_duigou@fwb.com (Mike Duigou) wrote:
  3247.  
  3248. > You *must* specify -1 for the action
  3249. > proc if the part returned from FindControl is kControlIndicatorPart.
  3250.  
  3251. The only flaw in the above statement occurs if you have installed your
  3252. action proc into the control.  In that situation you must use
  3253. ((ControlActionUPP)0).
  3254.  
  3255. Dave.
  3256.  
  3257. ==========================================================
  3258. Dave Nebinger                             dnebing@epix.net
  3259.              The Alt.Sources.Mac Archivist
  3260.      <http://www.AmbrosiaSW.com/alt.sources.mac/>
  3261.     <ftp://ftp.AmbrosiaSW.com/pub/alt.sources.mac/>
  3262.  
  3263. +++++++++++++++++++++++++++
  3264.  
  3265. >From awiner@oracle.com (Adam Winer)
  3266. Date: Thu, 25 Jan 1996 14:39:46 -0800
  3267. Organization: Oracle Corporation
  3268.  
  3269. In article <mike_duigou-2401961635400001@205.172.32.172>,
  3270. mike_duigou@fwb.com (Mike Duigou) wrote:
  3271.  
  3272. > The usual problem is that you have an action proc when the user is
  3273. > dragging the thumb. The toolbox is flawed in that you can have an action
  3274. > proc for the other scroll bar parts, but not the thumb. To track the thumb
  3275. > you can't do it with an action proc. You *must* specify -1 for the action
  3276. > proc if the part returned from FindControl is kControlIndicatorPart.
  3277. > Sample source exists for making the thumb have action when you move it.
  3278. > (Sorry, I don't have any).
  3279.  
  3280. Wrong.  You can have an action proc, but it has a different prototype
  3281. than the normal action proc.  Unfortunately, Apple never gave us
  3282. support in the headers for this (despite "clearly" documenting it
  3283. on page 5-117 of NIM:Toolbox Essentials)
  3284.  
  3285. Use the following in your headers:
  3286.  
  3287. typedef pascal void (*ControlIndicatorActionProcPtr)(void);
  3288.  
  3289. enum {
  3290.    uppControlIndicatorActionProcInfo = kPascalStackBased
  3291. };
  3292.  
  3293. #if GENERATINGCFM
  3294. typedef UniversalProcPtr ControlIndicatorActionUPP;
  3295.  
  3296. #define CallControlIndicatorActionProc(userRoutine)      \
  3297.       CallUniversalProc((UniversalProcPtr)(userRoutine), \
  3298.                          uppControlIndicatorActionProcInfo)
  3299.  
  3300. #define NewControlIndicatorActionProc(userRoutine)    \
  3301.       (ControlIndicatorActionUPP) \
  3302.         NewRoutineDescriptor((ProcPtr)(userRoutine), \
  3303.                              uppControlIndicatorActionProcInfo, \
  3304.                              GetCurrentISA())
  3305. #else
  3306.  
  3307. typedef ControlIndicatorActionProcPtr ControlIndicatorActionUPP;
  3308.  
  3309. #define CallControlIndicatorActionProc(userRoutine)      \
  3310.       (*(userRoutine))()
  3311. #define NewControlIndicatorActionProc(userRoutine)    \
  3312.       (ControlIndicatorActionUPP)(userRoutine)
  3313.  
  3314. #endif
  3315.  
  3316.  
  3317. -- Adam Winer
  3318. awiner@us.oracle.com
  3319.  
  3320. ---------------------------
  3321.  
  3322. >From bwade@qualia.com (Bretton Wade)
  3323. Subject: [ANNOUNCE] BSP Tree Demo Application v1.3
  3324. Date: Wed, 24 Jan 1996 23:50:35 -0500
  3325. Organization: qualia, inc.
  3326.  
  3327. The Macintosh BSP Tree Demonstration application with complete CW 8 source
  3328. and projects is available at the URL
  3329.  
  3330. file://ftp.qualia.com/pub/bspfaq/BSP_Tree_Demo_1.3.sea.hqx
  3331.  
  3332. for more information about BSP Trees, the BSP Tree FAQ is available at the URL
  3333.  
  3334. http://www.qualia.com/bspfaq/
  3335.  
  3336. -- 
  3337. bwade@qualia.com
  3338. http://www.qualia.com/
  3339.  
  3340. ---------------------------
  3341.  
  3342. >From julian@cs.auckland.ac.nz (Julian Harris)
  3343. Subject: [Q] PowerPC VBLs?
  3344. Date: Wed, 24 Jan 1996 21:19:22 +1300
  3345. Organization: Computer Science, The University of Auckland
  3346.  
  3347. Hi all,
  3348.  
  3349. I've got a bit of code:
  3350.  
  3351.  
  3352.  
  3353. // Returns address of a VBL task record, from within a VBL task
  3354. pascal long GetVBLRec( void )
  3355.     ONEWORDINLINE( 0x2E88 );        // MOVE.L A0, (A7)
  3356.  
  3357.  
  3358.  
  3359. That is used inside the VBL routine:
  3360.  
  3361.  
  3362. // This is the task that is executed during a VBL
  3363. // NOTE: can not have debug information in an interrupt routine!
  3364.  
  3365. static pascal void ChangeCursor( void )
  3366.     {
  3367.     CursorTaskPtr   RecPtr;
  3368.  
  3369.  
  3370.  
  3371.     // Get cursor information.
  3372.     RecPtr = (CursorTaskPtr) GetVBLRec();
  3373.  
  3374.  
  3375.     // Display the next cursor
  3376.     SetCursor( *( RecPtr->myCursors[RecPtr->myFrame] ));
  3377.  
  3378.  
  3379.     // Advance to the next cursor frame
  3380.     RecPtr->myFrame++;
  3381.  
  3382.  
  3383.     // Wrap around to the first cursor
  3384.     if (RecPtr->myFrame >= RecPtr->numberOfCursors)
  3385.         RecPtr->myFrame = 0;
  3386.  
  3387.  
  3388.     // Set task to run again
  3389.     RecPtr->myVBLTask.vblCount = InterruptDelay;
  3390.     
  3391.     }
  3392.  
  3393.  
  3394.  
  3395. But I don't know how to do this on the PowerPC. I get a link error on
  3396. GetVBLRec which is reasonable because it's 68k ASM.
  3397.  
  3398. Anyone have any ideas?
  3399.  
  3400. TIA.
  3401. .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
  3402. "I can't remember when I've felt better!"       >  Julian Harris, Programmer   >
  3403. - Ralph Wilson after trying new Norecog        >  Comp. Sci. Dept.     x8915  >
  3404.   vitamins with special memory inhibitors.    >  The University of Auckland  >
  3405.                                              >  julian@cs.auckland.ac.nz    >
  3406.  
  3407. +++++++++++++++++++++++++++
  3408.  
  3409. >From erichsen@pacificnet.net (Erichsen)
  3410. Date: Thu, 25 Jan 1996 13:52:38 -0700
  3411. Organization: Coalition to Ban Dihydrogen Monoxide
  3412.  
  3413. In article <julian-2401962119230001@julian.cs.auckland.ac.nz>,
  3414. julian@cs.auckland.ac.nz (Julian Harris) wrote:
  3415.  
  3416. >// Returns address of a VBL task record, from within a VBL task
  3417. >pascal long GetVBLRec( void )
  3418. >    ONEWORDINLINE( 0x2E88 );        // MOVE.L A0, (A7)
  3419.  
  3420. You don't need this on a PowerPC. The TaskPtr is passed as a parameter to
  3421. your routine on a PowerPC. Like:
  3422.  
  3423. pascal  void    ChangeCursor( CursorTaskPtr RecPtr )
  3424.  
  3425. ---------------------------
  3426.  
  3427. >From Kevin <webb@iftech.com>
  3428. Subject: _Jackson Trap
  3429. Date: Tue, 16 Jan 1996 13:08:14 -0500
  3430. Organization: Interpath -- Providing Internet access to North Carolina
  3431.  
  3432. Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3433. never heard of it before, but it has been causing some problems 
  3434. lately and I want to know what the story behind it is.
  3435.  
  3436. Please email: webb@iftech.com
  3437.  
  3438. Thanks
  3439. kpw
  3440.  
  3441. +++++++++++++++++++++++++++
  3442.  
  3443. >From greg@ohs.uwo.ca (Greg Chapman)
  3444. Date: Fri, 19 Jan 1996 11:27:04 -0500
  3445. Organization: OHS, Univ. of Western Ontario
  3446.  
  3447. In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3448.  
  3449. >Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3450. >never heard of it before, but it has been causing some problems 
  3451. >lately and I want to know what the story behind it is.
  3452.  
  3453. _Jackson was the code name for Color Quickdraw while it was being
  3454. developed. If you're throwing exceptions or bombing out and seeing
  3455. _Jackson, you're most likely in a low memory situation, or are doing
  3456. something evil to the graf ports et al.
  3457.  
  3458. -- 
  3459. Greg Chapman - Mac Programmer/Developer
  3460. Systems Manager - U. of Western Ontario OHS
  3461. London, Ontario, Canada
  3462. email: greg@ohs.uwo.ca
  3463. - -
  3464. "The laws of physics do not apply to this man."
  3465.  
  3466. +++++++++++++++++++++++++++
  3467.  
  3468. >From tg3@u.washington.edu (Thurman Gillespy III)
  3469. Date: Fri, 19 Jan 1996 10:23:22 -0800
  3470. Organization: Dept of Radiology, Univ of Washington
  3471.  
  3472. In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3473.  
  3474. >Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3475. >never heard of it before, but it has been causing some problems 
  3476. >lately and I want to know what the story behind it is.
  3477. >
  3478. >Please email: webb@iftech.com
  3479. >
  3480. >Thanks
  3481. >kpw
  3482.  
  3483. Ah, yes, our good friend Mr. _Jackson. Somewhere, somehow (in a galaxy far,
  3484. far away) you have caused QuickDraw to crash. Usually because it ran out
  3485. of memory. There are canonical methods for handling low memory situations, see
  3486. IM Memory for more details. A Q&D workaround is to _always_ leave a
  3487. memory cushion whenever you call NewPtr, NewHandle or anything else that
  3488. allocates memory. I leave about 50k to be safe, but your milage will most
  3489. definitely vary.
  3490.  
  3491. -- 
  3492. Thurman Gillespy III             |  tg3@u.washington.edu
  3493. Department of Radiology, SB-05   |  voice (206)543-3320
  3494. University of Washington         |  fax   (206)543-6317
  3495. Seattle, WA 98195                |
  3496.  
  3497. +++++++++++++++++++++++++++
  3498.  
  3499. >From bill@scconsult.com (Bill Stewart-Cole)
  3500. Date: Sat, 20 Jan 1996 22:43:07 -0600
  3501. Organization: ZOG
  3502.  
  3503. In article <Steve-1901961842000001@dwilson.vip.best.com>, Steve@emer.com
  3504. (Steve Wilson) wrote:
  3505.  
  3506. >In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3507. >
  3508. >> Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3509. >> never heard of it before, but it has been causing some problems 
  3510. >> lately and I want to know what the story behind it is.
  3511. >
  3512. >I think it is part of color quickdraw.  A lot of crashes occur there, but
  3513. >I don't know why that is.
  3514.  
  3515. It is not uncommon to crash  CQD by hitting a _Debugger call at the start
  3516. of _Jackson when you make a QuickDraw call with the wrong sort of
  3517. parameter (like a pointer where a handle should be) or when you are trying
  3518. to move large pictures or complex regions around. Deciphering the cause
  3519. post-crash is terribly difficult, but you can usually locate it by
  3520. sniffing out QuickDraw calls and looking carefully at the last one before
  3521. the crash.  What I have most often seen is that CQD is running out of
  3522. memory and slamming the stack down into the heap hard (not only thru the
  3523. heap end block, but sometimes right down thru the entire heap and out the
  3524. bottom end, which gets very ugly) by trying to push an entire picture,
  3525. pixmap, or region structure. Because CQD is running from system space it
  3526. doesn't run into any problems strictly from overwriting the entire
  3527. application heap. 
  3528.  
  3529. I believe that _Jackson itself is the lowest-level routine for throwing
  3530. pixel data into the frame buffer, and some wag at Apple equated this to
  3531. Jackson Pollack's spattering of paint on canvas.
  3532.  
  3533. -- 
  3534. Bill Stewart-Cole
  3535.  
  3536. I dare you to find my web page: Success is its own punishment
  3537.  
  3538. +++++++++++++++++++++++++++
  3539.  
  3540. >From Steve@emer.com (Steve Wilson)
  3541. Date: 20 Jan 1996 02:42:39 GMT
  3542. Organization: Emergent Behavior
  3543.  
  3544. In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3545.  
  3546. > Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3547. > never heard of it before, but it has been causing some problems 
  3548. > lately and I want to know what the story behind it is.
  3549.  
  3550. I think it is part of color quickdraw.  A lot of crashes occur there, but
  3551. I don't know why that is.
  3552.  
  3553. Steve Wilson
  3554. Emergent Behavior
  3555. (415) 494-6763
  3556. Steve@emer.com
  3557.  
  3558. +++++++++++++++++++++++++++
  3559.  
  3560. >From isis@isis-intl.com (Mike Cohen)
  3561. Date: Sat, 20 Jan 1996 14:47:40 -0600
  3562. Organization: ISIS International
  3563.  
  3564. In article <30FBE98E.7B2D@iftech.com>,
  3565. Kevin <webb@iftech.com> wrote:
  3566.  
  3567. >Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3568. >never heard of it before, but it has been causing some problems 
  3569. >lately and I want to know what the story behind it is.
  3570. >
  3571. That's an internal call used by Color QuickDraw. When you see the infamous
  3572. _Jackson crash, it means QuickDraw either didn't have enough memory to
  3573. complete some operation or some software corrupted QuickDraw's globals so
  3574. it just decided to give up.
  3575.  
  3576.  
  3577. --
  3578. Mike Cohen - isis@isis-intl.com
  3579. Home Page: http://www.isis-intl.com/
  3580. Sound is the same for all the world - Youssou N'dour, "Eyes Open"
  3581. *** Save Mystery Science Theater 3000! Comedy Central has decided to
  3582. *** cancel it. Call them at (212) 767-8600 and tell them what you think.
  3583. *** Full details at http://fermi.clas.virginia.edu/~jcp9j/canceled.html
  3584.  
  3585. +++++++++++++++++++++++++++
  3586.  
  3587. >From mclow@mailhost2.csusm.edu (Marshall Clow)
  3588. Date: Sat, 20 Jan 1996 22:30:45 -0800
  3589. Organization: Aladdin Systems
  3590.  
  3591. In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3592.  
  3593. >Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3594. >never heard of it before, but it has been causing some problems 
  3595. >lately and I want to know what the story behind it is.
  3596. >
  3597. >Please email: webb@iftech.com
  3598. >
  3599. Short answer:
  3600.    _Jackson is where QuickDraw goes to die.
  3601.  
  3602. Slightly longer answer:
  3603.    Color QuickDraw calls _Jachson when it is in the middle of doing
  3604. something and something goes wrong. An example of this is when it is
  3605. drawing a picture, and a region in the picture has to be scaled, and
  3606. MapRgn fails (not enough memory, for example).
  3607.  
  3608.    Because of some history that I am not privy to, QD jumps to Jackson,
  3609. rather than failing gracefully.
  3610.  
  3611.    There isn't really anything you can do about it, except make sure that
  3612. QuickDraw doesn't fail. 99% of the failures are caused by running out of
  3613. memory.
  3614. Don't run out of memory.
  3615.  
  3616. Not really a satisfying answer, is it?
  3617.  
  3618. -- 
  3619. Marshall Clow
  3620. Aladdin Systems
  3621.  
  3622. "They that can give up essential liberty to obtain a little temporary
  3623.  safety deserve neither liberty nor safety." -- Benjamin Franklin
  3624.  _Historical Review of Pennsylvania_, 1759
  3625.  
  3626. +++++++++++++++++++++++++++
  3627.  
  3628. >From dowdy@apple.com (Tom Dowdy)
  3629. Date: Tue, 23 Jan 1996 17:03:09 GMT
  3630. Organization: Apple Computer, Inc.
  3631.  
  3632. In article <bill-2001962243070001@sc1.scconsult.com>, bill@scconsult.com
  3633. (Bill Stewart-Cole) wrote:
  3634.  
  3635. > In article <Steve-1901961842000001@dwilson.vip.best.com>, Steve@emer.com
  3636. > (Steve Wilson) wrote:
  3637. > >In article <30FBE98E.7B2D@iftech.com>, Kevin <webb@iftech.com> wrote:
  3638. > >
  3639. > >> Does anyone have any info on the _Jackson trap ($ABO3).  I had 
  3640. > >> never heard of it before, but it has been causing some problems 
  3641. > >> lately and I want to know what the story behind it is.
  3642. > >
  3643. > >I think it is part of color quickdraw.  A lot of crashes occur there, but
  3644. > >I don't know why that is.
  3645. > It is not uncommon to crash  CQD by hitting a _Debugger call at the start
  3646. > of _Jackson when you make a QuickDraw call with the wrong sort of
  3647. > parameter (like a pointer where a handle should be) or when you are trying
  3648. > to move large pictures or complex regions around. Deciphering the cause
  3649. > post-crash is terribly difficult, but you can usually locate it by
  3650. > sniffing out QuickDraw calls and looking carefully at the last one before
  3651. > the crash.  What I have most often seen is that CQD is running out of
  3652. > memory and slamming the stack down into the heap hard (not only thru the
  3653. > heap end block, but sometimes right down thru the entire heap and out the
  3654. > bottom end, which gets very ugly) by trying to push an entire picture,
  3655. > pixmap, or region structure. Because CQD is running from system space it
  3656. > doesn't run into any problems strictly from overwriting the entire
  3657. > application heap. 
  3658. > I believe that _Jackson itself is the lowest-level routine for throwing
  3659. > pixel data into the frame buffer, and some wag at Apple equated this to
  3660. > Jackson Pollack's spattering of paint on canvas.
  3661.  
  3662. Sigh.  I post this every so often, but the incorrect information
  3663. still seems to be running around.
  3664.  
  3665. No.  _Jackson does *nothing* but throw a SysErr.  At the time
  3666. that 32 bit QuickDraw was being written, two traps were assigned to it.
  3667. One is now known as _QDDispatch, and the other was never used and kept
  3668. its original name _Jackson.  The code name for 32 bit QuickDraw was
  3669. Jackson Pollack.  As far as I know, _QDDispatch was never referred
  3670. to as _Pollack.  I can only assume that _Jackson was going to be
  3671. used for some setjmp style of error recovery, but that was never
  3672. implemented.
  3673.  
  3674. There are two common ways to end up in _Jackson.  Flat running
  3675. out of RAM, or incorrect parameters to QuickDraw.  Because of the
  3676. second, you'll sometimes have some bug that is totally unrelated
  3677. to drawing cause a _Jackson to fire -- you've trashed either your
  3678. heap or your own data, and later attempts to draw same result in
  3679. the trap.
  3680.  
  3681. -- 
  3682.  Tom Dowdy                  Internet: dowdy@apple.COM
  3683.  Apple Computer MS:302-3KS  UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy
  3684.  1 Infinite Loop            AppleLink: DOWDY1
  3685.  Cupertino, CA 95014       
  3686.  "The 'Ooh-Ah' Bird is so called because it lays square eggs."
  3687.  
  3688. ---------------------------
  3689.  
  3690. >From tbekiare@ux7.cso.uiuc.edu (Bekiares Tyrone Drew)
  3691. Subject: detecting CD-ROM
  3692. Date: 18 Jan 1996 22:00:44 GMT
  3693. Organization: University of Illinois at Urbana
  3694.  
  3695. How would I go about detecting if a machine has a CD-ROM drive
  3696. (internal or extenal)?
  3697.  
  3698. Should I go through the drive queue and look for removeables 
  3699. with a certain attribute? I can't think of what would mark
  3700. a CD-ROM drive differently than a syquest or bernoulli cartidge
  3701. other than read only..
  3702.  
  3703.  
  3704. thoughts?
  3705.  
  3706. Thanks!
  3707. tb93@uiuc.edu
  3708.  
  3709. +++++++++++++++++++++++++++
  3710.  
  3711. >From mclow@mailhost2.csusm.edu (Marshall Clow)
  3712. Date: Sat, 20 Jan 1996 22:38:09 -0800
  3713. Organization: Aladdin Systems
  3714.  
  3715. In article <4dmfuc$d92@vixen.cso.uiuc.edu>, tbekiare@ux7.cso.uiuc.edu
  3716. (Bekiares Tyrone Drew) wrote:
  3717.  
  3718. >How would I go about detecting if a machine has a CD-ROM drive
  3719. >(internal or extenal)?
  3720. >
  3721. >Should I go through the drive queue and look for removeables 
  3722. >with a certain attribute? I can't think of what would mark
  3723. >a CD-ROM drive differently than a syquest or bernoulli cartidge
  3724. >other than read only..
  3725. >
  3726. Short answer:
  3727.    You can't with 100% reliability.
  3728.  
  3729. Long answer is at:
  3730.    <http://dev.info.apple.com/techqa/devices/dev18.html#RTFToC18>
  3731.  
  3732. -- 
  3733. Marshall Clow
  3734. Aladdin Systems
  3735.  
  3736. "They that can give up essential liberty to obtain a little temporary
  3737.  safety deserve neither liberty nor safety." -- Benjamin Franklin
  3738.  _Historical Review of Pennsylvania_, 1759
  3739.  
  3740. ---------------------------
  3741.  
  3742. End of C.S.M.P. Digest
  3743. **********************
  3744.